GAS LISTING /tmp/ccowxWMg.s 			page 1


   1               	# 1 "CamInterfaceAsm.S"
   2               	# 1 "<built-in>"
   1               	;
   0               	
   0               	
   2               	;    Copyright (C) 2004    John Orlando
   3               	;    
   4               	;   AVRcam: a small real-time image processing engine.
   5               	
   6               	;    This program is free software; you can redistribute it and/or
   7               	;    modify it under the terms of the GNU General Public
   8               	;    License as published by the Free Software Foundation; either
   9               	;    version 2 of the License, or (at your option) any later version.
  10               	
  11               	;    This program is distributed in the hope that it will be useful,
  12               	;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13               	;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14               	;    General Public License for more details.
  15               	
  16               	;    You should have received a copy of the GNU General Public
  17               	;    License along with this program; if not, write to the Free Software
  18               	;    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19               	
  20               	;   For more information on the AVRcam, please contact:
  21               	
  22               	;   john@jrobot.net
  23               	
  24               	;   or go to www.jrobot.net for more details regarding the system.
  25               	;**********************************************************************
  26               	;       Module Name: CanInterfaceAsm.S
  27               	;       Module Date: 04/14/2004
  28               	;       Module Auth: John Orlando
  29               	;
  30               	;       Description: This module provides the low-level interface
  31               	;       to the OV6620 camera hardware.  It is responsible for
  32               	;   	acquiring each pixel block (R,G,B), performing the mapping
  33               	;       into an actual color (orange, purple, etc), run-length
  34               	;       encoding the data, and storing the info off to the appropriate
  35               	;       line buffer.  This routine is synchronized with the pixel data
  36               	;       so that no polling of the camera data needs to be done (the
  37               	;       OV6620 is clocked off of the same crystal source as the mega8,
  38               	;       thus providing inherent synchronization between the two).
  39               	;
  40               	;       Revision History:
  41               	;       Date        Rel Ver.    Notes
  42               	;       4/10/2004      0.1     Module created
  43               	;       6/30/2004      1.0     Initial release for Circuit Cellar
  44               	;                              contest.
  45               	;       1/16/2005      1.4     Fixed issue with the TCCR1B register
  46               	;                              where PCLK was getting routed to the
  47               	;                              timer1 even when it wasn't needed.
  48               	;                              This caused excessive counter overflow
  49               	;                              interrupts, and caused problems.  Now,
  50               	;                              the "PCLK" pipe feeds timer1 when needed,
  51               	;                              and is turned off when it isn't needed.
  52               	
  53               	#include <avr/io.h>
GAS LISTING /tmp/ccowxWMg.s 			page 2


   1               	/* Copyright (c) 2002,2003,2005,2006, Marek Michalkiewicz, Joerg Wunsch
   2               	   All rights reserved.
   3               	
   4               	   Redistribution and use in source and binary forms, with or without
   5               	   modification, are permitted provided that the following conditions are met:
   6               	
   7               	   * Redistributions of source code must retain the above copyright
   8               	     notice, this list of conditions and the following disclaimer.
   9               	
  10               	   * Redistributions in binary form must reproduce the above copyright
  11               	     notice, this list of conditions and the following disclaimer in
  12               	     the documentation and/or other materials provided with the
  13               	     distribution.
  14               	
  15               	   * Neither the name of the copyright holders nor the names of
  16               	     contributors may be used to endorse or promote products derived
  17               	     from this software without specific prior written permission.
  18               	
  19               	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20               	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21               	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22               	  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23               	  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24               	  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25               	  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26               	  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27               	  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28               	  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29               	  POSSIBILITY OF SUCH DAMAGE. */
  30               	
  31               	/* $Id: io.h,v 1.24.2.9 2006/09/13 20:41:41 arcanum Exp $ */
  32               	
  33               	/** \defgroup avr_io <avr/io.h>: AVR device-specific IO definitions
  34               	    \code #include <avr/io.h> \endcode
  35               	
  36               	    This header file includes the apropriate IO definitions for the
  37               	    device that has been specified by the <tt>-mmcu=</tt> compiler
  38               	    command-line switch.  This is done by diverting to the appropriate
  39               	    file <tt>&lt;avr/io</tt><em>XXXX</em><tt>.h&gt;</tt> which should
  40               	    never be included directly.  Some register names common to all
  41               	    AVR devices are defined directly within <tt>&lt;avr/io.h&gt;</tt>,
  42               	    but most of the details come from the respective include file.
  43               	
  44               	    Note that this file always includes
  45               	    \code #include <avr/sfr_defs.h> \endcode
  46               	    See \ref avr_sfr for the details.
  47               	
  48               	    Included are definitions of the IO register set and their
  49               	    respective bit values as specified in the Atmel documentation.
  50               	    Note that Atmel is not very consistent in its naming conventions,
  51               	    so even identical functions sometimes get different names on
  52               	    different devices.
  53               	
  54               	    Also included are the specific names useable for interrupt
  55               	    function definitions as documented
  56               	    \ref avr_signames "here".
  57               	
GAS LISTING /tmp/ccowxWMg.s 			page 3


  58               	    Finally, the following macros are defined:
  59               	
  60               	    - \b RAMEND
  61               	    <br>
  62               	    A constant describing the last on-chip RAM location.
  63               	    <br>
  64               	    - \b XRAMEND
  65               	    <br>
  66               	    A constant describing the last possible location in RAM.
  67               	    This is equal to RAMEND for devices that do not allow for
  68               	    external RAM.
  69               	    <br>
  70               	    - \b E2END
  71               	    <br>
  72               	    A constant describing the address of the last EEPROM cell.
  73               	    <br>
  74               	    - \b FLASHEND
  75               	    <br>
  76               	    A constant describing the last byte address in flash ROM.
  77               	    <br>
  78               	    - \b SPM_PAGESIZE
  79               	    <br>
  80               	    For devices with bootloader support, the flash pagesize
  81               	    (in bytes) to be used for the \c SPM instruction. */
  82               	
  83               	#ifndef _AVR_IO_H_
  84               	#define _AVR_IO_H_
  85               	
  86               	#include <avr/sfr_defs.h>
   1               	/* Copyright (c) 2002, Marek Michalkiewicz <marekm@amelek.gda.pl>
   2               	   All rights reserved.
   3               	
   4               	   Redistribution and use in source and binary forms, with or without
   5               	   modification, are permitted provided that the following conditions are met:
   6               	
   7               	   * Redistributions of source code must retain the above copyright
   8               	     notice, this list of conditions and the following disclaimer.
   9               	
  10               	   * Redistributions in binary form must reproduce the above copyright
  11               	     notice, this list of conditions and the following disclaimer in
  12               	     the documentation and/or other materials provided with the
  13               	     distribution.
  14               	
  15               	   * Neither the name of the copyright holders nor the names of
  16               	     contributors may be used to endorse or promote products derived
  17               	     from this software without specific prior written permission.
  18               	
  19               	   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20               	   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21               	   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22               	   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23               	   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24               	   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25               	   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26               	   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27               	   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28               	   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
GAS LISTING /tmp/ccowxWMg.s 			page 4


  29               	   POSSIBILITY OF SUCH DAMAGE.  */
  30               	
  31               	/* avr/sfr_defs.h - macros for accessing AVR special function registers */
  32               	
  33               	/* $Id: sfr_defs.h,v 1.16.2.2 2006/05/17 08:25:10 joerg_wunsch Exp $ */
  34               	
  35               	#ifndef _AVR_SFR_DEFS_H_
  36               	#define _AVR_SFR_DEFS_H_ 1
  37               	
  38               	/** \defgroup avr_sfr_notes Additional notes from <avr/sfr_defs.h>
  39               	    \ingroup avr_sfr
  40               	
  41               	   The \c <avr/sfr_defs.h> file is included by all of the \c <avr/ioXXXX.h>
  42               	   files, which use macros defined here to make the special function register
  43               	   definitions look like C variables or simple constants, depending on the
  44               	   <tt>_SFR_ASM_COMPAT</tt> define.  Some examples from \c <avr/iocanxx.h> to
  45               	   show how to define such macros:
  46               	
  47               	\code
  48               	#define PORTA   _SFR_IO8(0x02)
  49               	#define EEAR    _SFR_IO16(0x21)
  50               	#define UDR0    _SFR_MEM8(0xC6)
  51               	#define TCNT3   _SFR_MEM16(0x94)
  52               	#define CANIDT  _SFR_MEM32(0xF0)
  53               	\endcode
  54               	
  55               	   If \c _SFR_ASM_COMPAT is not defined, C programs can use names like
  56               	   <tt>PORTA</tt> directly in C expressions (also on the left side of
  57               	   assignment operators) and GCC will do the right thing (use short I/O
  58               	   instructions if possible).  The \c __SFR_OFFSET definition is not used in
  59               	   any way in this case.
  60               	
  61               	   Define \c _SFR_ASM_COMPAT as 1 to make these names work as simple constants
  62               	   (addresses of the I/O registers).  This is necessary when included in
  63               	   preprocessed assembler (*.S) source files, so it is done automatically if
  64               	   \c __ASSEMBLER__ is defined.  By default, all addresses are defined as if
  65               	   they were memory addresses (used in \c lds/sts instructions).  To use these
  66               	   addresses in \c in/out instructions, you must subtract 0x20 from them.
  67               	
  68               	   For more backwards compatibility, insert the following at the start of your
  69               	   old assembler source file:
  70               	
  71               	\code
  72               	#define __SFR_OFFSET 0
  73               	\endcode
  74               	
  75               	   This automatically subtracts 0x20 from I/O space addresses, but it's a
  76               	   hack, so it is recommended to change your source: wrap such addresses in
  77               	   macros defined here, as shown below.  After this is done, the
  78               	   <tt>__SFR_OFFSET</tt> definition is no longer necessary and can be removed.
  79               	
  80               	   Real example - this code could be used in a boot loader that is portable
  81               	   between devices with \c SPMCR at different addresses.
  82               	
  83               	\verbatim
  84               	<avr/iom163.h>: #define SPMCR _SFR_IO8(0x37)
  85               	<avr/iom128.h>: #define SPMCR _SFR_MEM8(0x68)
GAS LISTING /tmp/ccowxWMg.s 			page 5


  86               	\endverbatim
  87               	
  87               	
  88               	#ifndef __AVR_HAVE_MOVW__
  89               	#  if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
  90               	#   define __AVR_HAVE_MOVW__ 1
  91               	#  endif
  92               	#endif
  93               	
  94               	#ifndef __AVR_HAVE_LPMX__
  95               	# if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
  96               	#  define __AVR_HAVE_LPMX__ 1
  97               	# endif
  98               	#endif
  99               	
 100               	/*
 101               	 * Registers common to all AVR devices.
 102               	 */
 103               	
 104               	#if __AVR_ARCH__ != 1
 105               	/*
 106               	 * AVR architecture 1 has no RAM, thus no stack pointer.
 107               	 *
 108               	 * All other archs do have a stack pointer.  Some devices have only
 109               	 * less than 256 bytes of possible RAM locations (128 Bytes of SRAM
 110               	 * and no option for external RAM), thus SPH is officially "reserved"
 111               	 * for them.  We catch this case below after including the
 112               	 * device-specific ioXXXX.h file, by examining XRAMEND, and
 113               	 * #undef-ining SP and SPH in that case.
 114               	 */
 115               	/* Stack Pointer */
 116               	#define SP        _SFR_IO16(0x3D)
 117               	#define SPL       _SFR_IO8(0x3D)
 118               	#define SPH       _SFR_IO8(0x3E)
 119               	#endif /* #if __AVR_ARCH__ != 1 */
 120               	
 121               	/* Status REGister */
 122               	#define SREG      _SFR_IO8(0x3F)
 123               	
 124               	/* Status Register - SREG */
 125               	#define    SREG_I       7
 126               	#define    SREG_T       6
 127               	#define    SREG_H       5
 128               	#define    SREG_S       4
 129               	#define    SREG_V       3
 130               	#define    SREG_N       2
 131               	#define    SREG_Z       1
 132               	#define    SREG_C       0
 133               	
 134               	/* Pointer definition */
 135               	#if __AVR_ARCH__ != 1
 136               	/* avr1 has only the Z pointer */
 137               	#define    XL           r26
 138               	#define    XH           r27
 139               	#define    YL           r28
 140               	#define    YH           r29
 141               	#endif /* #if __AVR_ARCH__ != 1 */
GAS LISTING /tmp/ccowxWMg.s 			page 6


 142               	#define    ZL           r30
 143               	#define    ZH           r31
 144               	
 145               	/*
 146               	 * Only few devices come without EEPROM.  In order to assemble the
 147               	 * EEPROM library components without defining a specific device, we
 148               	 * keep the EEPROM-related definitions here.
 149               	 */
 150               	#if defined(__COMPILING_AVR_LIBC__)
 151               	
 152               	/* EEPROM Control Register */
 153               	#define EECR	_SFR_IO8(0x1C)
 154               	
 155               	/* EEPROM Data Register */
 156               	#define EEDR	_SFR_IO8(0x1D)
 157               	
 158               	/* EEPROM Address Register */
 159               	#define EEAR	_SFR_IO16(0x1E)
 160               	#define EEARL	_SFR_IO8(0x1E)
 161               	#define EEARH	_SFR_IO8(0x1F)
 162               	
 163               	/* EEPROM Control Register */
 164               	#define    EERIE        3
 165               	#define    EEMWE        2
 166               	#define    EEWE         1
 167               	#define    EERE         0
 168               	
 169               	#endif /* __COMPILING_AVR_LIBC__ */
 170               	
 171               	#if defined (__AVR_AT94K__)
 172               	#  include <avr/ioat94k.h>
 173               	#elif defined (__AVR_AT43USB320__)
 174               	#  include <avr/io43u32x.h>
 175               	#elif defined (__AVR_AT43USB355__)
 176               	#  include <avr/io43u35x.h>
 177               	#elif defined (__AVR_AT76C711__)
 178               	#  include <avr/io76c711.h>
 179               	#elif defined (__AVR_AT86RF401__)
 180               	#  include <avr/io86r401.h>
 181               	#elif defined (__AVR_AT90PWM2__)
 182               	#  include <avr/io90pwmx.h>
 183               	#elif defined (__AVR_AT90PWM3__)
 184               	#  include <avr/io90pwmx.h>
 185               	#elif defined (__AVR_ATmega128__)
 186               	#  include <avr/iom128.h>
 187               	#elif defined (__AVR_ATmega1280__)
 188               	#  include <avr/iom1280.h>
 189               	#elif defined (__AVR_ATmega1281__)
 190               	#  include <avr/iom1281.h>
 191               	#elif defined (__AVR_ATmega2560__)
 192               	#  include <avr/iom2560.h>
 193               	#elif defined (__AVR_ATmega2561__)
 194               	#  include <avr/iom2561.h>
 195               	#elif defined (__AVR_AT90CAN32__)
 196               	#  include <avr/iocan32.h>
 197               	#elif defined (__AVR_AT90CAN64__)
 198               	#  include <avr/iocan64.h>
GAS LISTING /tmp/ccowxWMg.s 			page 7


 199               	#elif defined (__AVR_AT90CAN128__)
 200               	#  include <avr/iocan128.h>
 201               	#elif defined (__AVR_AT90USB646__)
 202               	#  include <avr/iousb646.h>
 203               	#elif defined (__AVR_AT90USB647__)
 204               	#  include <avr/iousb647.h>
 205               	#elif defined (__AVR_AT90USB1286__)
 206               	#  include <avr/iousb1286.h>
 207               	#elif defined (__AVR_AT90USB1287__)
 208               	#  include <avr/iousb1287.h>
 209               	#elif defined (__AVR_ATmega64__)
 210               	#  include <avr/iom64.h>
 211               	#elif defined (__AVR_ATmega640__)
 212               	#  include <avr/iom640.h>
 213               	#elif defined (__AVR_ATmega644__)
 214               	#  include <avr/iom644.h>
 215               	#elif defined (__AVR_ATmega644P__)
 216               	#  include <avr/iom644.h>
 217               	#elif defined (__AVR_ATmega645__)
 218               	#  include <avr/iom645.h>
 219               	#elif defined (__AVR_ATmega6450__)
 220               	#  include <avr/iom6450.h>
 221               	#elif defined (__AVR_ATmega649__)
 222               	#  include <avr/iom649.h>
 223               	#elif defined (__AVR_ATmega6490__)
 224               	#  include <avr/iom6490.h>
 225               	#elif defined (__AVR_ATmega103__)
 226               	#  include <avr/iom103.h>
 227               	#elif defined (__AVR_ATmega32__)
 228               	#  include <avr/iom32.h>
 229               	#elif defined (__AVR_ATmega323__)
 230               	#  include <avr/iom323.h>
 231               	#elif defined (__AVR_ATmega324P__)
 232               	#  include <avr/iom324.h>
 233               	#elif defined (__AVR_ATmega325__)
 234               	#  include <avr/iom325.h>
 235               	#elif defined (__AVR_ATmega3250__)
 236               	#  include <avr/iom3250.h>
 237               	#elif defined (__AVR_ATmega329__)
 238               	#  include <avr/iom329.h>
 239               	#elif defined (__AVR_ATmega3290__)
 240               	#  include <avr/iom3290.h>
 241               	#elif defined (__AVR_ATmega406__)
 242               	#  include <avr/iom406.h>
 243               	#elif defined (__AVR_ATmega16__)
 244               	#  include <avr/iom16.h>
 245               	#elif defined (__AVR_ATmega161__)
 246               	#  include <avr/iom161.h>
 247               	#elif defined (__AVR_ATmega162__)
 248               	#  include <avr/iom162.h>
 249               	#elif defined (__AVR_ATmega163__)
 250               	#  include <avr/iom163.h>
 251               	#elif defined (__AVR_ATmega164P__)
 252               	#  include <avr/iom164.h>
 253               	#elif defined (__AVR_ATmega165__)
 254               	#  include <avr/iom165.h>
 255               	#elif defined (__AVR_ATmega165P__)
GAS LISTING /tmp/ccowxWMg.s 			page 8


 256               	#  include <avr/iom165p.h>
 257               	#elif defined (__AVR_ATmega168__)
 258               	#  include <avr/iom168.h>
 259               	#elif defined (__AVR_ATmega169__)
 260               	#  include <avr/iom169.h>
 261               	#elif defined (__AVR_ATmega169P__)
 262               	#  include <avr/iom169p.h>
 263               	#elif defined (__AVR_ATmega8__)
 264               	#  include <avr/iom8.h>
   1               	/* Copyright (c) 2002, Marek Michalkiewicz
   2               	   All rights reserved.
   3               	
   4               	   Redistribution and use in source and binary forms, with or without
   5               	   modification, are permitted provided that the following conditions are met:
   6               	
   7               	   * Redistributions of source code must retain the above copyright
   8               	     notice, this list of conditions and the following disclaimer.
   9               	
  10               	   * Redistributions in binary form must reproduce the above copyright
  11               	     notice, this list of conditions and the following disclaimer in
  12               	     the documentation and/or other materials provided with the
  13               	     distribution.
  14               	
  15               	   * Neither the name of the copyright holders nor the names of
  16               	     contributors may be used to endorse or promote products derived
  17               	     from this software without specific prior written permission.
  18               	
  19               	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20               	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21               	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22               	  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23               	  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24               	  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25               	  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26               	  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27               	  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28               	  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29               	  POSSIBILITY OF SUCH DAMAGE. */
  30               	
  31               	/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */
  32               	
  33               	/* avr/iom8.h - definitions for ATmega8 */
  34               	
  35               	#ifndef _AVR_IOM8_H_
  36               	#define _AVR_IOM8_H_ 1
  37               	
  38               	/* This file should only be included from <avr/io.h>, never directly. */
  39               	
  40               	#ifndef _AVR_IO_H_
  41               	#  error "Include <avr/io.h> instead of this file."
  42               	#endif
  43               	
  44               	#ifndef _AVR_IOXXX_H_
  45               	#  define _AVR_IOXXX_H_ "iom8.h"
  46               	#else
  47               	#  error "Attempt to include more than one <avr/ioXXX.h> file."
  48               	#endif 
GAS LISTING /tmp/ccowxWMg.s 			page 9


  49               	
  50               	/* I/O registers */
  51               	
  52               	/* TWI stands for "Two Wire Interface" or "TWI Was I2C(tm)" */
  53               	#define TWBR	_SFR_IO8(0x00)
  54               	#define TWSR	_SFR_IO8(0x01)
  55               	#define TWAR	_SFR_IO8(0x02)
  56               	#define TWDR	_SFR_IO8(0x03)
  57               	
  58               	/* ADC */
  59               	#define ADCW	_SFR_IO16(0x04)
  60               	#ifndef __ASSEMBLER__
  61               	#define ADC	_SFR_IO16(0x04)
  62               	#endif
  63               	#define ADCL	_SFR_IO8(0x04)
  64               	#define ADCH	_SFR_IO8(0x05)
  65               	#define ADCSR	_SFR_IO8(0x06)
  66               	#define ADCSRA	_SFR_IO8(0x06)  /* Changed in 2486H-AVR-09/02 */
  67               	#define ADMUX	_SFR_IO8(0x07)
  68               	
  69               	/* analog comparator */
  70               	#define ACSR	_SFR_IO8(0x08)
  71               	
  72               	/* USART */
  73               	#define UBRRL	_SFR_IO8(0x09)
  74               	#define UCSRB	_SFR_IO8(0x0A)
  75               	#define UCSRA	_SFR_IO8(0x0B)
  76               	#define UDR	_SFR_IO8(0x0C)
  77               	
  78               	/* SPI */
  79               	#define SPCR	_SFR_IO8(0x0D)
  80               	#define SPSR	_SFR_IO8(0x0E)
  81               	#define SPDR	_SFR_IO8(0x0F)
  82               	
  83               	/* Port D */
  84               	#define PIND	_SFR_IO8(0x10)
  85               	#define DDRD	_SFR_IO8(0x11)
  86               	#define PORTD	_SFR_IO8(0x12)
  87               	
  88               	/* Port C */
  89               	#define PINC	_SFR_IO8(0x13)
  90               	#define DDRC	_SFR_IO8(0x14)
  91               	#define PORTC	_SFR_IO8(0x15)
  92               	
  93               	/* Port B */
  94               	#define PINB	_SFR_IO8(0x16)
  95               	#define DDRB	_SFR_IO8(0x17)
  96               	#define PORTB	_SFR_IO8(0x18)
  97               	
  98               	/* EEPROM Control Register */
  99               	#define EECR	_SFR_IO8(0x1C)
 100               	
 101               	/* EEPROM Data Register */
 102               	#define EEDR	_SFR_IO8(0x1D)
 103               	
 104               	/* EEPROM Address Register */
 105               	#define EEAR	_SFR_IO16(0x1E)
GAS LISTING /tmp/ccowxWMg.s 			page 10


 106               	#define EEARL	_SFR_IO8(0x1E)
 107               	#define EEARH	_SFR_IO8(0x1F)
 108               	
 109               	#define UCSRC	_SFR_IO8(0x20)
 110               	#define UBRRH	_SFR_IO8(0x20)
 111               	
 112               	#define WDTCR	_SFR_IO8(0x21)
 113               	#define ASSR	_SFR_IO8(0x22)
 114               	
 115               	/* Timer 2 */
 116               	#define OCR2	_SFR_IO8(0x23)
 117               	#define TCNT2	_SFR_IO8(0x24)
 118               	#define TCCR2	_SFR_IO8(0x25)
 119               	
 120               	/* Timer 1 */
 121               	#define ICR1	_SFR_IO16(0x26)
 122               	#define ICR1L	_SFR_IO8(0x26)
 123               	#define ICR1H	_SFR_IO8(0x27)
 124               	#define OCR1B	_SFR_IO16(0x28)
 125               	#define OCR1BL	_SFR_IO8(0x28)
 126               	#define OCR1BH	_SFR_IO8(0x29)
 127               	#define OCR1A	_SFR_IO16(0x2A)
 128               	#define OCR1AL	_SFR_IO8(0x2A)
 129               	#define OCR1AH	_SFR_IO8(0x2B)
 130               	#define TCNT1	_SFR_IO16(0x2C)
 131               	#define TCNT1L	_SFR_IO8(0x2C)
 132               	#define TCNT1H	_SFR_IO8(0x2D)
 133               	#define TCCR1B	_SFR_IO8(0x2E)
 134               	#define TCCR1A	_SFR_IO8(0x2F)
 135               	
 136               	#define SFIOR	_SFR_IO8(0x30)
 137               	
 138               	#define OSCCAL	_SFR_IO8(0x31)
 139               	
 140               	/* Timer 0 */
 141               	#define TCNT0	_SFR_IO8(0x32)
 142               	#define TCCR0	_SFR_IO8(0x33)
 143               	
 144               	#define MCUCSR	_SFR_IO8(0x34)
 145               	#define MCUCR	_SFR_IO8(0x35)
 146               	
 147               	#define TWCR	_SFR_IO8(0x36)
 148               	
 149               	#define SPMCR	_SFR_IO8(0x37)
 150               	
 151               	#define TIFR	_SFR_IO8(0x38)
 152               	#define TIMSK	_SFR_IO8(0x39)
 153               	
 154               	#define GIFR	_SFR_IO8(0x3A)
 155               	#define GIMSK	_SFR_IO8(0x3B)
 156               	#define GICR	_SFR_IO8(0x3B)   /* Changed in 2486H-AVR-09/02 */
 157               	
 158               	/* 0x3C reserved (OCR0?) */
 159               	
 160               	/* 0x3D..0x3E SP */
 161               	
 162               	/* 0x3F SREG */
GAS LISTING /tmp/ccowxWMg.s 			page 11


 163               	
 164               	/* Interrupt vectors */
 165               	
 166               	/* External Interrupt Request 0 */
 167               	#define INT0_vect			_VECTOR(1)
 168               	#define SIG_INTERRUPT0			_VECTOR(1)
 169               	
 170               	/* External Interrupt Request 1 */
 171               	#define INT1_vect			_VECTOR(2)
 172               	#define SIG_INTERRUPT1			_VECTOR(2)
 173               	
 174               	/* Timer/Counter2 Compare Match */
 175               	#define TIMER2_COMP_vect		_VECTOR(3)
 176               	#define SIG_OUTPUT_COMPARE2		_VECTOR(3)
 177               	
 178               	/* Timer/Counter2 Overflow */
 179               	#define TIMER2_OVF_vect			_VECTOR(4)
 180               	#define SIG_OVERFLOW2			_VECTOR(4)
 181               	
 182               	/* Timer/Counter1 Capture Event */
 183               	#define TIMER1_CAPT_vect		_VECTOR(5)
 184               	#define SIG_INPUT_CAPTURE1		_VECTOR(5)
 185               	
 186               	/* Timer/Counter1 Compare Match A */
 187               	#define TIMER1_COMPA_vect		_VECTOR(6)
 188               	#define SIG_OUTPUT_COMPARE1A		_VECTOR(6)
 189               	
 190               	/* Timer/Counter1 Compare Match B */
 191               	#define TIMER1_COMPB_vect		_VECTOR(7)
 192               	#define SIG_OUTPUT_COMPARE1B		_VECTOR(7)
 193               	
 194               	/* Timer/Counter1 Overflow */
 195               	#define TIMER1_OVF_vect			_VECTOR(8)
 196               	#define SIG_OVERFLOW1			_VECTOR(8)
 197               	
 198               	/* Timer/Counter0 Overflow */
 199               	#define TIMER0_OVF_vect			_VECTOR(9)
 200               	#define SIG_OVERFLOW0			_VECTOR(9)
 201               	
 202               	/* Serial Transfer Complete */
 203               	#define SPI_STC_vect			_VECTOR(10)
 204               	#define SIG_SPI				_VECTOR(10)
 205               	
 206               	/* USART, Rx Complete */
 207               	#define USART_RXC_vect			_VECTOR(11)
 208               	#define SIG_UART_RECV			_VECTOR(11)
 209               	
 210               	/* USART Data Register Empty */
 211               	#define USART_UDRE_vect			_VECTOR(12)
 212               	#define SIG_UART_DATA			_VECTOR(12)
 213               	
 214               	/* USART, Tx Complete */
 215               	#define USART_TXC_vect			_VECTOR(13)
 216               	#define SIG_UART_TRANS			_VECTOR(13)
 217               	
 218               	/* ADC Conversion Complete */
 219               	#define ADC_vect			_VECTOR(14)
GAS LISTING /tmp/ccowxWMg.s 			page 12


 220               	#define SIG_ADC				_VECTOR(14)
 221               	
 222               	/* EEPROM Ready */
 223               	#define EE_RDY_vect			_VECTOR(15)
 224               	#define SIG_EEPROM_READY		_VECTOR(15)
 225               	
 226               	/* Analog Comparator */
 227               	#define ANA_COMP_vect			_VECTOR(16)
 228               	#define SIG_COMPARATOR			_VECTOR(16)
 229               	
 230               	/* 2-wire Serial Interface */
 231               	#define TWI_vect			_VECTOR(17)
 232               	#define SIG_2WIRE_SERIAL		_VECTOR(17)
 233               	
 234               	/* Store Program Memory Ready */
 235               	#define SPM_RDY_vect			_VECTOR(18)
 236               	#define SIG_SPM_READY			_VECTOR(18)
 237               	
 238               	#define _VECTORS_SIZE 38
 239               	
 240               	/* Bit numbers */
 241               	
 242               	/* GIMSK / GICR */
 243               	#define INT1	7
 244               	#define INT0	6
 245               	#define IVSEL	1
 246               	#define IVCE	0
 247               	
 248               	/* GIFR */
 249               	#define INTF1	7
 250               	#define INTF0	6
 251               	
 252               	/* TIMSK */
 253               	#define OCIE2	7
 254               	#define TOIE2	6
 255               	#define TICIE1	5
 256               	#define OCIE1A	4
 257               	#define OCIE1B	3
 258               	#define TOIE1	2
 259               	/* bit 1 reserved (OCIE0?) */
 260               	#define TOIE0	0
 261               	
 262               	/* TIFR */
 263               	#define OCF2	7
 264               	#define TOV2	6
 265               	#define ICF1	5
 265               	#elif defined (__AVR_ATmega48__)
 266               	#  include <avr/iom48.h>
 267               	#elif defined (__AVR_ATmega88__)
 268               	#  include <avr/iom88.h>
 269               	#elif defined (__AVR_ATmega8515__)
 270               	#  include <avr/iom8515.h>
 271               	#elif defined (__AVR_ATmega8535__)
 272               	#  include <avr/iom8535.h>
 273               	#elif defined (__AVR_AT90S8535__)
 274               	#  include <avr/io8535.h>
 275               	#elif defined (__AVR_AT90C8534__)
GAS LISTING /tmp/ccowxWMg.s 			page 13


 276               	#  include <avr/io8534.h>
 277               	#elif defined (__AVR_AT90S8515__)
 278               	#  include <avr/io8515.h>
 279               	#elif defined (__AVR_AT90S4434__)
 280               	#  include <avr/io4434.h>
 281               	#elif defined (__AVR_AT90S4433__)
 282               	#  include <avr/io4433.h>
 283               	#elif defined (__AVR_AT90S4414__)
 284               	#  include <avr/io4414.h>
 285               	#elif defined (__AVR_ATtiny22__)
 286               	#  include <avr/iotn22.h>
 287               	#elif defined (__AVR_ATtiny26__)
 288               	#  include <avr/iotn26.h>
 289               	#elif defined (__AVR_AT90S2343__)
 290               	#  include <avr/io2343.h>
 291               	#elif defined (__AVR_AT90S2333__)
 292               	#  include <avr/io2333.h>
 293               	#elif defined (__AVR_AT90S2323__)
 294               	#  include <avr/io2323.h>
 295               	#elif defined (__AVR_AT90S2313__)
 296               	#  include <avr/io2313.h>
 297               	#elif defined (__AVR_ATtiny2313__)
 298               	#  include <avr/iotn2313.h>
 299               	#elif defined (__AVR_ATtiny13__)
 300               	#  include <avr/iotn13.h>
 301               	#elif defined (__AVR_ATtiny25__)
 302               	#  include <avr/iotn25.h>
 303               	#elif defined (__AVR_ATtiny45__)
 304               	#  include <avr/iotn45.h>
 305               	#elif defined (__AVR_ATtiny85__)
 306               	#  include <avr/iotn85.h>
 307               	#elif defined (__AVR_ATtiny24__)
 308               	#  include <avr/iotn24.h>
 309               	#elif defined (__AVR_ATtiny44__)
 310               	#  include <avr/iotn44.h>
 311               	#elif defined (__AVR_ATtiny84__)
 312               	#  include <avr/iotn84.h>
 313               	#elif defined (__AVR_ATtiny261__)
 314               	#  include <avr/iotn261.h>
 315               	#elif defined (__AVR_ATtiny461__)
 316               	#  include <avr/iotn461.h>
 317               	#elif defined (__AVR_ATtiny861__)
 318               	#  include <avr/iotn861.h>
 319               	/* avr1: the following only supported for assembler programs */
 320               	#elif defined (__AVR_ATtiny28__)
 321               	#  include <avr/iotn28.h>
 322               	#elif defined (__AVR_AT90S1200__)
 323               	#  include <avr/io1200.h>
 324               	#elif defined (__AVR_ATtiny15__)
 325               	#  include <avr/iotn15.h>
 326               	#elif defined (__AVR_ATtiny12__)
 327               	#  include <avr/iotn12.h>
 328               	#elif defined (__AVR_ATtiny11__)
 329               	#  include <avr/iotn11.h>
 330               	#else
 331               	#  if !defined(__COMPILING_AVR_LIBC__)
 332               	#    warning "device type not defined"
GAS LISTING /tmp/ccowxWMg.s 			page 14


 333               	#  endif
 334               	#endif
 335               	
 336               	#include <avr/portpins.h>
   1               	/* Copyright (c) 2003  Theodore A. Roth
   2               	   All rights reserved.
   3               	
   4               	   Redistribution and use in source and binary forms, with or without
   5               	   modification, are permitted provided that the following conditions are met:
   6               	
   7               	   * Redistributions of source code must retain the above copyright
   8               	     notice, this list of conditions and the following disclaimer.
   9               	
  10               	   * Redistributions in binary form must reproduce the above copyright
  11               	     notice, this list of conditions and the following disclaimer in
  12               	     the documentation and/or other materials provided with the
  13               	     distribution.
  14               	
  15               	   * Neither the name of the copyright holders nor the names of
  16               	     contributors may be used to endorse or promote products derived
  17               	     from this software without specific prior written permission.
  18               	
  19               	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20               	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21               	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22               	  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23               	  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24               	  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25               	  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26               	  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27               	  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28               	  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29               	  POSSIBILITY OF SUCH DAMAGE. */
  30               	
  31               	/* $Id: portpins.h,v 1.3.4.1 2006/03/10 16:22:38 aesok Exp $ */
  32               	
  33               	#ifndef _AVR_PORTPINS_H_
  34               	#define _AVR_PORTPINS_H_ 1
  35               	
  36               	/* This file should only be included from <avr/io.h>, never directly. */
  37               	
  38               	#ifndef _AVR_IO_H_
  39               	#  error "Include <avr/io.h> instead of this file."
  40               	#endif
  41               	
  42               	/* Define Generic PORTn, DDn, and PINn values. */
  43               	
  44               	/* Port Data Register (generic) */
  45               	#define    PORT7        7
  46               	#define    PORT6        6
  47               	#define    PORT5        5
  48               	#define    PORT4        4
  49               	#define    PORT3        3
  50               	#define    PORT2        2
  51               	#define    PORT1        1
  52               	#define    PORT0        0
  53               	
GAS LISTING /tmp/ccowxWMg.s 			page 15


  54               	/* Port Data Direction Register (generic) */
  55               	#define    DD7          7
  56               	#define    DD6          6
  57               	#define    DD5          5
  58               	#define    DD4          4
  59               	#define    DD3          3
  60               	#define    DD2          2
  61               	#define    DD1          1
  62               	#define    DD0          0
  63               	
  64               	/* Port Input Pins (generic) */
  65               	#define    PIN7         7
  66               	#define    PIN6         6
  67               	#define    PIN5         5
  68               	#define    PIN4         4
  69               	#define    PIN3         3
  70               	#define    PIN2         2
  71               	#define    PIN1         1
  72               	#define    PIN0         0
  73               	
  74               	/* Define PORTxn values for all possible port pins. */
  75               	
  76               	/* PORT A */
  77               	
  78               	#if defined(PA0)
  79               	#  define PORTA0 PA0
  80               	#endif
  81               	#if defined(PA1)
  82               	#  define PORTA1 PA1
  83               	#endif
  84               	#if defined(PA2)
  85               	#  define PORTA2 PA2
  86               	#endif
  87               	#if defined(PA3)
  88               	#  define PORTA3 PA3
  89               	#endif
  90               	#if defined(PA4)
  91               	#  define PORTA4 PA4
  92               	#endif
  93               	#if defined(PA5)
  94               	#  define PORTA5 PA5
  95               	#endif
  96               	#if defined(PA6)
  97               	#  define PORTA6 PA6
  98               	#endif
  99               	#if defined(PA7)
 100               	#  define PORTA7 PA7
 101               	#endif
 102               	
 103               	/* PORT B */
 104               	
 105               	#if defined(PB0)
 106               	#  define PORTB0 PB0
 107               	#endif
 108               	#if defined(PB1)
 109               	#  define PORTB1 PB1
 110               	#endif
GAS LISTING /tmp/ccowxWMg.s 			page 16


 111               	#if defined(PB2)
 112               	#  define PORTB2 PB2
 113               	#endif
 114               	#if defined(PB3)
 115               	#  define PORTB3 PB3
 116               	#endif
 117               	#if defined(PB4)
 118               	#  define PORTB4 PB4
 119               	#endif
 120               	#if defined(PB5)
 121               	#  define PORTB5 PB5
 122               	#endif
 123               	#if defined(PB6)
 124               	#  define PORTB6 PB6
 125               	#endif
 126               	#if defined(PB7)
 127               	#  define PORTB7 PB7
 128               	#endif
 129               	
 130               	/* PORT C */
 131               	
 132               	#if defined(PC0)
 133               	#  define PORTC0 PC0
 134               	#endif
 135               	#if defined(PC1)
 136               	#  define PORTC1 PC1
 137               	#endif
 138               	#if defined(PC2)
 139               	#  define PORTC2 PC2
 140               	#endif
 141               	#if defined(PC3)
 142               	#  define PORTC3 PC3
 143               	#endif
 144               	#if defined(PC4)
 145               	#  define PORTC4 PC4
 146               	#endif
 147               	#if defined(PC5)
 148               	#  define PORTC5 PC5
 149               	#endif
 150               	#if defined(PC6)
 151               	#  define PORTC6 PC6
 152               	#endif
 153               	#if defined(PC7)
 154               	#  define PORTC7 PC7
 155               	#endif
 156               	
 157               	/* PORT D */
 158               	
 159               	#if defined(PD0)
 160               	#  define PORTD0 PD0
 161               	#endif
 162               	#if defined(PD1)
 163               	#  define PORTD1 PD1
 164               	#endif
 165               	#if defined(PD2)
 166               	#  define PORTD2 PD2
 167               	#endif
GAS LISTING /tmp/ccowxWMg.s 			page 17


 168               	#if defined(PD3)
 169               	#  define PORTD3 PD3
 170               	#endif
 171               	#if defined(PD4)
 172               	#  define PORTD4 PD4
 173               	#endif
 174               	#if defined(PD5)
 175               	#  define PORTD5 PD5
 176               	#endif
 177               	#if defined(PD6)
 178               	#  define PORTD6 PD6
 179               	#endif
 180               	#if defined(PD7)
 181               	#  define PORTD7 PD7
 182               	#endif
 183               	
 184               	/* PORT E */
 185               	
 186               	#if defined(PE0)
 187               	#  define PORTE0 PE0
 188               	#endif
 189               	#if defined(PE1)
 190               	#  define PORTE1 PE1
 191               	#endif
 192               	#if defined(PE2)
 193               	#  define PORTE2 PE2
 194               	#endif
 195               	#if defined(PE3)
 196               	#  define PORTE3 PE3
 197               	#endif
 198               	#if defined(PE4)
 199               	#  define PORTE4 PE4
 200               	#endif
 201               	#if defined(PE5)
 202               	#  define PORTE5 PE5
 203               	#endif
 204               	#if defined(PE6)
 205               	#  define PORTE6 PE6
 206               	#endif
 207               	#if defined(PE7)
 208               	#  define PORTE7 PE7
 209               	#endif
 210               	
 211               	/* PORT F */
 212               	
 213               	#if defined(PF0)
 214               	#  define PORTF0 PF0
 215               	#endif
 216               	#if defined(PF1)
 217               	#  define PORTF1 PF1
 218               	#endif
 219               	#if defined(PF2)
 220               	#  define PORTF2 PF2
 221               	#endif
 222               	#if defined(PF3)
 223               	#  define PORTF3 PF3
 224               	#endif
GAS LISTING /tmp/ccowxWMg.s 			page 18


 225               	#if defined(PF4)
 226               	#  define PORTF4 PF4
 227               	#endif
 228               	#if defined(PF5)
 229               	#  define PORTF5 PF5
 230               	#endif
 231               	#if defined(PF6)
 232               	#  define PORTF6 PF6
 233               	#endif
 234               	#if defined(PF7)
 235               	#  define PORTF7 PF7
 236               	#endif
 237               	
 238               	/* PORT G */
 239               	
 240               	#if defined(PG0)
 241               	#  define PORTG0 PG0
 242               	#endif
 243               	#if defined(PG1)
 244               	#  define PORTG1 PG1
 245               	#endif
 246               	#if defined(PG2)
 247               	#  define PORTG2 PG2
 248               	#endif
 249               	#if defined(PG3)
 250               	#  define PORTG3 PG3
 251               	#endif
 252               	#if defined(PG4)
 253               	#  define PORTG4 PG4
 254               	#endif
 255               	#if defined(PG5)
 256               	#  define PORTG5 PG5
 257               	#endif
 258               	#if defined(PG6)
 259               	#  define PORTG6 PG6
 260               	#endif
 261               	#if defined(PG7)
 262               	#  define PORTG7 PG7
 263               	#endif
 264               	
 265               	/* PORT H */
 266               	
 267               	#if defined(PH0)
 268               	#  define PORTH0 PH0
 269               	#endif
 270               	#if defined(PH1)
 271               	#  define PORTH1 PH1
 272               	#endif
 273               	#if defined(PH2)
 274               	#  define PORTH2 PH2
 275               	#endif
 276               	#if defined(PH3)
 277               	#  define PORTH3 PH3
 278               	#endif
 279               	#if defined(PH4)
 280               	#  define PORTH4 PH4
 281               	#endif
GAS LISTING /tmp/ccowxWMg.s 			page 19


 282               	#if defined(PH5)
 283               	#  define PORTH5 PH5
 284               	#endif
 285               	#if defined(PH6)
 286               	#  define PORTH6 PH6
 287               	#endif
 288               	#if defined(PH7)
 289               	#  define PORTH7 PH7
 290               	#endif
 291               	
 292               	/* PORT J */
 293               	
 294               	#if defined(PJ0)
 295               	#  define PORTJ0 PJ0
 296               	#endif
 297               	#if defined(PJ1)
 298               	#  define PORTJ1 PJ1
 299               	#endif
 300               	#if defined(PJ2)
 301               	#  define PORTJ2 PJ2
 302               	#endif
 303               	#if defined(PJ3)
 304               	#  define PORTJ3 PJ3
 305               	#endif
 306               	#if defined(PJ4)
 307               	#  define PORTJ4 PJ4
 308               	#endif
 309               	#if defined(PJ5)
 310               	#  define PORTJ5 PJ5
 311               	#endif
 312               	#if defined(PJ6)
 313               	#  define PORTJ6 PJ6
 314               	#endif
 315               	#if defined(PJ7)
 316               	#  define PORTJ7 PJ7
 317               	#endif
 318               	
 319               	/* PORT K */
 320               	
 321               	#if defined(PK0)
 322               	#  define PORTK0 PK0
 323               	#endif
 324               	#if defined(PK1)
 325               	#  define PORTK1 PK1
 326               	#endif
 327               	#if defined(PK2)
 328               	#  define PORTK2 PK2
 329               	#endif
 330               	#if defined(PK3)
 331               	#  define PORTK3 PK3
 332               	#endif
 333               	#if defined(PK4)
 334               	#  define PORTK4 PK4
 335               	#endif
 336               	#if defined(PK5)
 337               	#  define PORTK5 PK5
 337               	
GAS LISTING /tmp/ccowxWMg.s 			page 20


 338               	#if __AVR_ARCH__ != 1
 339               	#  if XRAMEND < 0x100 && !defined(__COMPILING_AVR_LIBC__)
 340               	#    undef SP
 341               	#    define SP     _SFR_IO8(0x3D)
 342               	#    undef SPH
 343               	#  endif
 344               	#endif
 345               	
 346               	#include <avr/version.h>
   1               	/* Copyright (c) 2005, Joerg Wunsch                               -*- c -*-
   2               	   All rights reserved.
   3               	
   4               	   Redistribution and use in source and binary forms, with or without
   5               	   modification, are permitted provided that the following conditions are met:
   6               	
   7               	   * Redistributions of source code must retain the above copyright
   8               	     notice, this list of conditions and the following disclaimer.
   9               	
  10               	   * Redistributions in binary form must reproduce the above copyright
  11               	     notice, this list of conditions and the following disclaimer in
  12               	     the documentation and/or other materials provided with the
  13               	     distribution.
  14               	
  15               	   * Neither the name of the copyright holders nor the names of
  16               	     contributors may be used to endorse or promote products derived
  17               	     from this software without specific prior written permission.
  18               	
  19               	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20               	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21               	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22               	  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23               	  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24               	  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25               	  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26               	  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27               	  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28               	  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29               	  POSSIBILITY OF SUCH DAMAGE. */
  30               	
  31               	/* $Id: version.h.in,v 1.1 2005/09/12 20:18:12 joerg_wunsch Exp $ */
  32               	
  33               	/** \defgroup avr_version <avr/version.h>: avr-libc version macros
  34               	    \code #include <avr/version.h> \endcode
  35               	
  36               	    This header file defines macros that contain version numbers and
  37               	    strings describing the current version of avr-libc.
  38               	
  39               	    The version number itself basically consists of three pieces that
  40               	    are separated by a dot: the major number, the minor number, and
  41               	    the revision number.  For development versions (which use an odd
  42               	    minor number), the string representation additionally gets the
  43               	    date code (YYYYMMDD) appended.
  44               	
  45               	    This file will also be included by \c <avr/io.h>.  That way,
  46               	    portable tests can be implemented using \c <avr/io.h> that can be
  47               	    used in code that wants to remain backwards-compatible to library
  48               	    versions prior to the date when the library version API had been
GAS LISTING /tmp/ccowxWMg.s 			page 21


  49               	    added, as referenced but undefined C preprocessor macros
  50               	    automatically evaluate to 0.
  51               	*/
  52               	
  53               	#ifndef _AVR_VERSION_H_
  54               	#define _AVR_VERSION_H_
  55               	
  56               	/** \ingroup avr_version
  57               	    String literal representation of the current library version. */
  58               	#define __AVR_LIBC_VERSION_STRING__ "1.4.5"
  59               	
  60               	/** \ingroup avr_version
  61               	    Numerical representation of the current library version.
  62               	
  63               	    In the numerical representation, the major number is multiplied by
  64               	    10000, the minor number by 100, and all three parts are then
  65               	    added.  It is intented to provide a monotonically increasing
  66               	    numerical value that can easily be used in numerical checks.
  67               	 */
  68               	#define __AVR_LIBC_VERSION__        10405UL
  69               	
  70               	/** \ingroup avr_version
  71               	    String literal representation of the release date. */
  72               	#define __AVR_LIBC_DATE_STRING__    "20061009"
  73               	
  74               	/** \ingroup avr_version
  75               	    Numerical representation of the release date. */
  76               	#define __AVR_LIBC_DATE_            20061009UL
  77               	
  78               	/** \ingroup avr_version
  79               	    Library major version number. */
  80               	#define __AVR_LIBC_MAJOR__          1
  81               	
  82               	/** \ingroup avr_version
  83               	    Library minor version number. */
  84               	#define __AVR_LIBC_MINOR__          4
  85               	
  86               	/** \ingroup avr_version
  87               	    Library revision number. */
  88               	#define __AVR_LIBC_REVISION__       5
  89               	
  90               	#endif /* _AVR_VERSION_H_ */
  91               	...
 347               	
  54               	#include "Events.h"
   1               	#ifndef EVENTS_H
   2               	#define EVENTS_H
   3               	
   4               	/*
   5               	    Copyright (C) 2004    John Orlando
   6               	    
   7               	   AVRcam: a small real-time image processing engine.
   8               	
   9               	    This program is free software; you can redistribute it and/or
  10               	    modify it under the terms of the GNU General Public
  11               	    License as published by the Free Software Foundation; either
  12               	    version 2 of the License, or (at your option) any later version.
GAS LISTING /tmp/ccowxWMg.s 			page 22


  13               	
  14               	    This program is distributed in the hope that it will be useful,
  15               	    but WITHOUT ANY WARRANTY; without even the implied warranty of
  16               	    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17               	    General Public License for more details.
  18               	
  19               	    You should have received a copy of the GNU General Public
  20               	    License along with this program; if not, write to the Free Software
  21               	    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22               	
  23               	   For more information on the AVRcam, please contact:
  24               	
  25               	   john@jrobot.net
  26               	
  27               	   or go to www.jrobot.net for more details regarding the system.
  28               	*/
  29               	/*********************************************************** 
  30               		Module Name: Events.h
  31               		Module Date: 05/23/2004
  32               		Module Auth: John Orlando
  33               		
  34               		Description: This file provides the external interface
  35               		to the events that can be published/processed in the
  36               		system.  It is specifically by itself (and nothing
  37               		else should be defined in here) so that both .c and
  38               		.S (assembly) files can include this file without
  39               		a problem.
  40               	    
  41               	    Revision History:
  42               	    Date        Rel Ver.    Notes
  43               	    4/10/2004      0.1     Module created
  44               	    6/30/2004      1.0     Initial release for Circuit Cellar
  45               	                           contest.
  46               	    *******************************************************/
  47               	
  48               	/* Definitions */
  49               	/* Originally, all events were passed in a bitmask...however,
  50               	an event FIFO was finally used, but the coding of the event
  51               	definitions were never translated back....doesn't make a
  52               	difference, but looks a little weird */
  53               	#define EV_SERIAL_DATA_RECEIVED		0x01
  54               	#define EV_DUMP_FRAME				0x02
  55               	#define EV_PROCESS_FRAME_COMPLETE	0x04
  55               			
  56               			.extern fastEventBitmask    ; This is the flag used to indicate to the rest
  57               										; of the system that the line is complete
  58               									
  59               	#define HREF_INTERRUPT_ENABLE_MASK   0x80
  60               	#define HREF_INTERRUPT_DISABLE_MASK  0x7F
  61               	#define ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK  0x04
  62               	#define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
  63               	#define G_PORT						_SFR_IO_ADDR(PINC)  
  64               	#define RB_PORT						_SFR_IO_ADDR(PINB)  
  65               	#define PIXEL_RUN_START_INITIAL     0x50     	; This value causes our pixel counter (TCNT1)
  66               													; to overflow after 176 (horizontal) pixels
  67               	
  68               	#define RED_MEM_OFFSET				0x00
GAS LISTING /tmp/ccowxWMg.s 			page 23


  69               	#define GREEN_MEM_OFFSET			0x10
  70               	#define BLUE_MEM_OFFSET				0x20
  71               	
  72               	; A pixelBlock is defined as a contiguous group of 4 pixels that are combined 
  73               	; together to form a specific color.  Typically, this is formed by sampling a
  74               	; a green value, followed by a red and blue value (since we are dealing
  75               	; with Bayer color data).  We could optionally sample a second green with
  76               	; the red and average the greens, because the eye is more sensitive to
  77               	; green, but for speed we don't do this.  These three values (RGB) are then
  78               	; used as indices into the color membership lookup table (memLookup) to
  79               	; determine which color the pixelBlock maps into.  The memLookup table is
  80               	; manually generated for now (though it will hopefully be modified over
  81               	; the serial interface eventually).
  82               	;
  83               	; Here is a pixel block:
  84               	; ...G  G  G  G...  (row x)
  85               	; ...B  R  B  R...  (row x+1)
  86               	;    |  |  |  |--this is skipped 
  87               	;    |  |  |--this is skipped
  88               	;    |  |--this is sampled
  89               	;    |--this is sampled
  90               	
  91               	; As pixel blocks are sampled, the red, green, and blue values are
  92               	; used to index into their respective color maps.  The color maps
  93               	; return values that can be logically ANDed together so that a 
  94               	; particular RGB triplet will result in a single bit being set
  95               	; after the AND operation.  This single bit indicates which color
  96               	; the RGB triplet represents.  It is also possible for no bits to
  97               	; be set after the AND process, indicating that the RGB triplet
  98               	; does not map to any of the colors configured in the color map.
  99               	; This isn't quite as fast as a pure RGB lookup table, but
 100               	; it then again it doesn't require 2^12 (4-bits for each color
 101               	; channel) bytes to store the lookup table.  It takes just a few
 102               	; more cycles, and only requires 48 bytes of precious RAM (16
 103               	; per color channel, since our resolution on each color channel
 104               	; is only 4-bits).  Not bad....for more information, see:
 105               	; http://www.cs.cmu.edu/~trb/papers/wirevision00.pdf for more
 106               	; information on this color segmentation technique.
 107               	
 108               	; One other note: this code does depend on the colorMap residing
 109               	; at a well-defined position in memory; specifically, it mus
 110               	; start at a 256-byte boundary so that the lowest byte in the
 111               	; map is set to 0x00.  Currently, the colorMap is forced to
 112               	; start at RAM location 0x300.  This could potentially be changed
 113               	; by the developer if needed, but offsets would have to be added
 114               	; in to the colorMap look-up code below to make it work.
 115               	
 116               	
 117               	; These are the registers that will be used throughout this
 118               	; module for acquiring each line of pixel data
 119               	pixelCount			= 16
 120               	pixelRunStart		= 17
 121               	lastColor     		= 18
 122               	tmp1				= 19	; be sure to not use tmp1 and color simultaneously
 123               	tmp2				= 20
 124               	color           	= 19
 125               	greenData       	= 20
GAS LISTING /tmp/ccowxWMg.s 			page 24


 126               	blueData        	= 21
 127               	colorMapLow	  		= 22
 128               	colorMapHigh		= 23
 129               	prevLineBuffLow  	= 22  	; overlaps with memLookupLow (but orthogonal)
 130               	prevLineBuffHigh	= 23	; overlaps with memLookupHigh (but orthogonal)
 131               	currLineBuffLow     = 24
 132               	currLineBuffHigh  	= 25
 133               	
 134               	        .section .text
 135               	
 136               	; These are the global assembly function names that are accessed via other
 137               	; C functions
 138               	        .global CamIntAsm_waitForNewTrackingFrame
 139               			.global CamIntAsm_waitForNewDumpFrame
 140               			.global CamIntAsm_acquireDumpLine
 141               			.global CamIntAsm_acquireTrackingLine
 142               			.global SIG_INTERRUPT0
 143               			.global SIG_INTERRUPT1
 144               			.global SIG_OVERFLOW0
 145               			.global SIG_OVERFLOW1
 146               			
 147               	;*****************************************************************		
 148               	;   	Function Name: CamIntAsm_waitForNewTrackingFrame
 149               	;       Function Description: This function is responsible for
 150               	;       going to sleep until a new frame begins (indicated by
 151               	;    	VSYNC transitioning from low to high.  This will wake
 152               	;       the "VSYNC sleep" up and allow it to continue with 
 153               	;       the acquireLine function, where the system waits for
 154               	;       an "HREF sleep" that we use to synchronize with the
 155               	;       data.  
 156               	;       Inputs:  r25 - MSB of currentLineBuffer
 157               	;                r24 - LSB of currentLineBuffer
 158               	;				 r23 - MSB of colorMap
 159               	; 				 r22 - LSB of colorMap
 160               	;       Outputs: none
 161               	;       NOTES: This function doesn't really return...it sorta just
 162               	;       floats into the acquireLine function after the "VSYNC sleep"
 163               	;       is awoken, then begins processing the line data.  Once
 164               	;		176 pixels are sampled (and the counter overflows), then
 165               	;		an interrupt will occur, the 'T' bit in the SREG will be
 166               	;		set, and the function will return.
 167               	;*****************************************************************
 168               			
 169               	CamIntAsm_waitForNewTrackingFrame:
 170:CamInterfaceAsm.S **** 		sbi		_SFR_IO_ADDR(PORTD),PD6  ; For testing...
 171:CamInterfaceAsm.S **** 		cbi		_SFR_IO_ADDR(PORTD),PD6		
 172:CamInterfaceAsm.S **** 		sleep
 173               	
 174               	;*****************************************************************
 175               	; REMEMBER...everything from here on out is critically timed to be
 176               	; synchronized with the flow of pixel data from the camera...
 177               	;*****************************************************************
 178               	
 179               	CamIntAsm_acquireTrackingLine:
 180:CamInterfaceAsm.S **** 		brts	_cleanUp
 181               			;sbi		_SFR_IO_ADDR(PORTD),PD6 ; For testing...
 182               			;cbi		_SFR_IO_ADDR(PORTD),PD6
GAS LISTING /tmp/ccowxWMg.s 			page 25


 183               	        
 184:CamInterfaceAsm.S ****         in      tmp1,_SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
 185:CamInterfaceAsm.S ****         ori     tmp1, 0x07                 ; feed Timer1
 186:CamInterfaceAsm.S ****         out     _SFR_IO_ADDR(TCCR1B),tmp1 
 187               											; The line is about to start...		
 188:CamInterfaceAsm.S **** 		ldi     pixelCount,0			; Initialize the RLE stats...
 189:CamInterfaceAsm.S **** 		ldi		pixelRunStart,PIXEL_RUN_START_INITIAL  	; Remember, we always calculate
 190               															; the pixel run length as
 191               															; TCNT1L - pixelRunStart
 192               			
 193:CamInterfaceAsm.S **** 		ldi		lastColor,0x00				; clear out the last color before we start
 194               			
 195:CamInterfaceAsm.S **** 		mov   	XH,currLineBuffHigh    	; Load the pointer to the current line
 196:CamInterfaceAsm.S **** 		mov		XL,currLineBuffLow		; buffer into the X pointer regs		 
 197               			
 198:CamInterfaceAsm.S **** 		mov   	ZH,colorMapHigh      	; Load the pointers to the membership
 199:CamInterfaceAsm.S **** 		mov		ZL,colorMapLow			; lookup tables (ZL and YL will be overwritten
 200:CamInterfaceAsm.S **** 		mov 	YH,colorMapHigh	 		; as soon as we start reading data) to Z and Y
 201               			
 202:CamInterfaceAsm.S **** 		in		tmp1, _SFR_IO_ADDR(TIMSK)			; enable TIMER1 to start counting
 203:CamInterfaceAsm.S **** 		ori		tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK 	; external PCLK pulses and interrupt on 
 204:CamInterfaceAsm.S **** 		out		_SFR_IO_ADDR(TIMSK),tmp1			; overflow
 205               			
 206:CamInterfaceAsm.S **** 		ldi 	tmp1,PIXEL_RUN_START_INITIAL	; set up the TCNT1 to overflow (and
 207:CamInterfaceAsm.S **** 		ldi 	tmp2,0xFF 						; interrupts) after 176 pixels		
 208:CamInterfaceAsm.S **** 		out 	_SFR_IO_ADDR(TCNT1H),tmp2		
 209:CamInterfaceAsm.S **** 		out 	_SFR_IO_ADDR(TCNT1L),tmp1				
 210               			
 211:CamInterfaceAsm.S **** 		mov		YL,colorMapLow		
 212               			
 213:CamInterfaceAsm.S **** 		in 		tmp1, _SFR_IO_ADDR(GICR)	; enable the HREF interrupt...remember, we
 214               												; only use this interrupt to synchronize
 215               												; the beginning of the line
 216:CamInterfaceAsm.S **** 		ori 	tmp1, HREF_INTERRUPT_ENABLE_MASK
 217:CamInterfaceAsm.S **** 		out		_SFR_IO_ADDR(GICR), tmp1
 218               			
 219               	;*******************************************************************************************
 220               	;   Track Frame handler 
 221               	;*******************************************************************************************		
 222               			
 223               	_trackFrame:		
 224:CamInterfaceAsm.S **** 		sbi		_SFR_IO_ADDR(PORTD),PD6
 225:CamInterfaceAsm.S **** 		sleep   ; ...And we wait...
 226               			
 227               		; Returning from the interrupt/sleep wakeup will consume
 228               		; 14 clock cycles (7 to wakeup from idle sleep, 3 to vector, and 4 to return)	
 229               	
 230               		; Disable the HREF interrupt
 231:CamInterfaceAsm.S **** 		cbi		_SFR_IO_ADDR(PORTD),PD6
 232:CamInterfaceAsm.S **** 		in 		tmp1, _SFR_IO_ADDR(GICR)
 233:CamInterfaceAsm.S **** 		andi 	tmp1, HREF_INTERRUPT_DISABLE_MASK
 234:CamInterfaceAsm.S **** 		out		_SFR_IO_ADDR(GICR), tmp1
 235               			
 236               		; A couple of NOPs are needed here to sync up the pixel data...the number (2)
 237               		; of NOPs was determined emperically by trial and error.
 238:CamInterfaceAsm.S **** 		nop
 239:CamInterfaceAsm.S **** 		nop
GAS LISTING /tmp/ccowxWMg.s 			page 26


 240               	_acquirePixelBlock:							;							Clock Cycle Count
 241:CamInterfaceAsm.S **** 		in		ZL,RB_PORT         			; sample the red value (PINB)		(1)
 242:CamInterfaceAsm.S **** 		in		YL,G_PORT         			; sample the green value (PINC)		(1)
 243:CamInterfaceAsm.S **** 		andi	YL,0x0F            			; clear the high nibble				(1)
 244:CamInterfaceAsm.S **** 		ldd		color,Z+RED_MEM_OFFSET  	; lookup the red membership			(2)
 245:CamInterfaceAsm.S **** 		in		ZL,RB_PORT         			; sample the blue value (PINB)		(1)
 246:CamInterfaceAsm.S **** 		ldd		greenData,Y+GREEN_MEM_OFFSET; lookup the green membership		(2)
 247:CamInterfaceAsm.S **** 		ldd		blueData,Z+BLUE_MEM_OFFSET	; lookup the blue membership		(2)
 248:CamInterfaceAsm.S **** 		and		color,greenData 			; mask memberships together			(1)
 249:CamInterfaceAsm.S **** 		and		color,blueData  			; to produce the final color		(1)
 250:CamInterfaceAsm.S **** 		brts    _cleanUpTrackingLine		; if some interrupt routine has		(1...not set)
 251               												; come in and set our T flag in 
 252               												; SREG, then we need to hop out
 253               												; and blow away this frames data (common cleanup)									
 254:CamInterfaceAsm.S **** 		cp		color,lastColor     		; check to see if the run continues	(1)
 255:CamInterfaceAsm.S **** 		breq    _acquirePixelBlock  		;									(2...equal)
 256               												;									___________
 257               												;								16 clock cycles 		
 258               												; (16 clock cycles = 1 uS = 1 pixelBlock time)
 259               			
 260               			; Toggle the debug line to indicate a color change
 261:CamInterfaceAsm.S **** 		sbi     _SFR_IO_ADDR(PORTD),PD6
 262:CamInterfaceAsm.S **** 		nop
 263:CamInterfaceAsm.S **** 		cbi		_SFR_IO_ADDR(PORTD),PD6
 264               			
 265:CamInterfaceAsm.S **** 		mov		tmp2,pixelRunStart				; get the count value of the
 266               													; current pixel run
 267:CamInterfaceAsm.S **** 		in		pixelCount,_SFR_IO_ADDR(TCNT1L)	; get the current TCNT1 value 
 268:CamInterfaceAsm.S **** 		mov   	pixelRunStart,pixelCount		; reload pixelRunStart for the
 269               													; next run
 270:CamInterfaceAsm.S **** 		sub		pixelCount,tmp2     			; pixelCount = TCNT1L - pixelRunStart
 271               											
 272:CamInterfaceAsm.S **** 		st		X+,lastColor			; record the color run in the current line buffer
 273:CamInterfaceAsm.S **** 		st		X+,pixelCount			; with its length
 274:CamInterfaceAsm.S **** 		mov		lastColor,color			; set lastColor so we can figure out when it changes
 275               			
 276:CamInterfaceAsm.S **** 		nop								; waste one more cycle for a total of 16
 277:CamInterfaceAsm.S **** 		rjmp	_acquirePixelBlock	
 278               			
 279               	; _cleanUpTrackingLine is used to write the last run length block off to the currentLineBuffer so
 280               	; that all 176 pixels in the line are accounted for.
 281               	_cleanUpTrackingLine:		
 282:CamInterfaceAsm.S **** 		ldi		pixelCount,0xFF		; the length of the last run is ALWAYS 0xFF minus the last
 283:CamInterfaceAsm.S **** 		sub		pixelCount,pixelRunStart  	; pixelRunStart
 284               			
 285:CamInterfaceAsm.S **** 		inc		pixelCount				; increment pixelCount since we actually need to account
 286               											; for the overflow of TCNT1
 287               											
 288:CamInterfaceAsm.S **** 		st		X+,color				; record the color run in the current line buffer
 289:CamInterfaceAsm.S **** 		st		X,pixelCount		
 290:CamInterfaceAsm.S **** 		rjmp	_cleanUp
 291               			
 292               	_cleanUpDumpLine:		
 293               			; NOTE: If serial data is received, to interrupt the tracking of a line, we'll
 294               			; get a EV_SERIAL_DATA_RECEIVED event, and the T bit set so we will end the
 295               			; line's processing...however, the PCLK will keep on ticking for the rest of
 296               			; the frame/line, which will cause the TCNT to eventually overflow and
GAS LISTING /tmp/ccowxWMg.s 			page 27


 297               			; interrupt us, generating a EV_ACQUIRE_LINE_COMPLETE event.  We don't want
 298               			; this, so we need to actually turn off the PCLK counting each time we exit
 299               			; this loop, and only turn it on when we begin acquiring lines....
 300               	        ; NOT NEEDED FOR NOW...
 301               			;in		tmp1, _SFR_IO_ADDR(TIMSK)			; disable TIMER1 to stop counting
 302               			;andi	tmp1, DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 	; external PCLK pulses
 303               			;out		_SFR_IO_ADDR(TIMSK),tmp1
 304               	
 305               	_cleanUp:
 306               	        ; Disable the external clocking of the Timer1 counter 
 307:CamInterfaceAsm.S ****         in      tmp1, _SFR_IO_ADDR(TCCR1B)
 308:CamInterfaceAsm.S ****         andi    tmp1, 0xF8
 309:CamInterfaceAsm.S ****         out     _SFR_IO_ADDR(TCCR1B),tmp1
 310               			
 311               			; Toggle the debug line to indicate the line is complete
 312:CamInterfaceAsm.S **** 		sbi     _SFR_IO_ADDR(PORTD),PD6
 313:CamInterfaceAsm.S **** 		cbi		_SFR_IO_ADDR(PORTD),PD6
 314:CamInterfaceAsm.S **** 		clt				; clear out the T bit since we have detected
 315               							; the interruption and are exiting to handle it
 316               	_exit:
 317:CamInterfaceAsm.S **** 		ret
 318               			
 319               	;*****************************************************************		
 320               	;   	Function Name: CamIntAsm_waitForNewDumpFrame
 321               	;       Function Description: This function is responsible for
 322               	;       going to sleep until a new frame begins (indicated by
 323               	;    	VSYNC transitioning from low to high.  This will wake
 324               	;       the "VSYNC sleep" up and allow it to continue with 
 325               	;       acquiring a line of pixel data to dump out to the UI.
 326               	;       Inputs:  r25 - MSB of currentLineBuffer
 327               	;                r24 - LSB of currentLineBuffer
 328               	;				 r23 - MSB of prevLineBuffer
 329               	;				 r22 - LSB of prevLineBuffer
 330               	;       Outputs: none
 331               	;       NOTES: This function doesn't really return...it sorta just
 332               	;       floats into the acquireDumpLine function after the "VSYNC sleep"
 333               	;       is awoken.
 334               	;*****************************************************************		
 335               	CamIntAsm_waitForNewDumpFrame:
 336:CamInterfaceAsm.S **** 		sbi		_SFR_IO_ADDR(PORTD),PD6  ; For testing...
 337:CamInterfaceAsm.S **** 		cbi		_SFR_IO_ADDR(PORTD),PD6
 338:CamInterfaceAsm.S **** 		sleep
 339               	
 340               	;*****************************************************************
 341               	; REMEMBER...everything from here on out is critically timed to be
 342               	; synchronized with the flow of pixel data from the camera...
 343               	;*****************************************************************
 344               	
 345               	CamIntAsm_acquireDumpLine:
 346:CamInterfaceAsm.S **** 		brts	_cleanUp
 347               			;sbi		_SFR_IO_ADDR(PORTD),PD6 ; For testing...
 348               			;cbi		_SFR_IO_ADDR(PORTD),PD6
 349               			
 350:CamInterfaceAsm.S **** 		mov   	XH,currLineBuffHigh    	; Load the pointer to the current line
 351:CamInterfaceAsm.S **** 		mov		XL,currLineBuffLow		; buffer into the X pointer regs
 352               	
 353:CamInterfaceAsm.S **** 		mov		YH,prevLineBuffHigh		; Load the pointer to the previous line
GAS LISTING /tmp/ccowxWMg.s 			page 28


 354:CamInterfaceAsm.S **** 		mov		YL,prevLineBuffLow  	; buffer into the Y pointer regs
 355               			
 356:CamInterfaceAsm.S **** 		ldi 	tmp1,PIXEL_RUN_START_INITIAL	; set up the TCNT1 to overflow (and
 357:CamInterfaceAsm.S **** 		ldi 	tmp2,0xFF 						; interrupts) after 176 pixels		
 358:CamInterfaceAsm.S **** 		out 	_SFR_IO_ADDR(TCNT1H),tmp2		
 359:CamInterfaceAsm.S **** 		out 	_SFR_IO_ADDR(TCNT1L),tmp1		
 360               			
 361:CamInterfaceAsm.S ****         in      tmp1, _SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
 362:CamInterfaceAsm.S ****         ori     tmp1, 0x07                 ; feed Timer1
 363:CamInterfaceAsm.S ****         out     _SFR_IO_ADDR(TCCR1B),tmp1
 364:CamInterfaceAsm.S ****         nop
 365               	        
 366:CamInterfaceAsm.S **** 		in		tmp1, _SFR_IO_ADDR(TIMSK)			; enable TIMER1 to start counting
 367:CamInterfaceAsm.S **** 		ori		tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK 	; external PCLK pulses and interrupt on 
 368:CamInterfaceAsm.S **** 		out		_SFR_IO_ADDR(TIMSK),tmp1			; overflow			
 369               			
 370:CamInterfaceAsm.S **** 		in 		tmp1, _SFR_IO_ADDR(GICR)	; enable the HREF interrupt...remember, we
 371               												; only use this interrupt to synchronize
 372               												; the beginning of the line
 373:CamInterfaceAsm.S **** 		ori 	tmp1, HREF_INTERRUPT_ENABLE_MASK
 374:CamInterfaceAsm.S **** 		out		_SFR_IO_ADDR(GICR), tmp1
 375               			
 376               	;*******************************************************************************************
 377               	;   Dump Frame handler 
 378               	;*******************************************************************************************		
 379               			
 380               	_dumpFrame:		
 381:CamInterfaceAsm.S **** 		sbi		_SFR_IO_ADDR(PORTD),PD6
 382:CamInterfaceAsm.S **** 		sleep   ; ...And we wait...
 383               	
 384:CamInterfaceAsm.S **** 		cbi		_SFR_IO_ADDR(PORTD),PD6
 385:CamInterfaceAsm.S **** 		in 		tmp1, _SFR_IO_ADDR(GICR)			; disable the HREF interrupt
 386:CamInterfaceAsm.S **** 		andi 	tmp1, HREF_INTERRUPT_DISABLE_MASK  	; so we don't get interrupted
 387:CamInterfaceAsm.S **** 		out		_SFR_IO_ADDR(GICR), tmp1			; while dumping the line
 388               		
 389:CamInterfaceAsm.S **** 		nop		; Remember...if we ever remove the "cbi" instruction above,
 390               					; we need to add two more NOPs to cover this
 391               	    
 392               	; Ok...the following loop needs to run in 8 clock cycles, so we can get every
 393               	; pixel in the line...this shouldn't be a problem, since the PCLK timing was
 394               	; reduced by a factor of 2 whenever we go to dump a line (this is to give us
 395               	; enough time to do the sampling and storing of the pixel data).  In addition,
 396               	; it is assumed that we will have to do some minor processing on the data right
 397               	; before we send it out, like mask off the top 4-bits of each, and then pack both
 398               	; low nibbles into a single byte for transmission...we just don't have time to
 399               	; do that here (only 8 instruction cycles :-)  )
 400               	_sampleDumpPixel:
 401:CamInterfaceAsm.S **** 		in		tmp1,G_PORT				; sample the G value					(1)
 402:CamInterfaceAsm.S **** 		in		tmp2,RB_PORT			; sample the R/B value					(1)
 403:CamInterfaceAsm.S **** 		st		X+,tmp1					; store to the currLineBuff and inc ptrs(2)
 404:CamInterfaceAsm.S **** 		st		Y+,tmp2					; store to the prevLineBuff and inc ptrs(2)
 405:CamInterfaceAsm.S **** 		brtc	_sampleDumpPixel		; loop back unless flag is set			(2...if not set)
 406               											;									___________
 407               											;									8 cycles normally
 408               																				
 409               			; if we make it here, it means the T flag is set, and we must have been interrupted
 410               			; so we need to exit (what if we were interrupted for serial? should we disable it?)
GAS LISTING /tmp/ccowxWMg.s 			page 29


 411:CamInterfaceAsm.S **** 		rjmp	_cleanUpDumpLine
 412               	
 413               	;***********************************************************
 414               	;	Function Name: <interrupt handler for External Interrupt0> 
 415               	;	Function Description: This function is responsible
 416               	;	for handling a rising edge on the Ext Interrupt 0.  This
 417               	;	routine simply returns, since we just want to wake up
 418               	;	whenever the VSYNC transitions (meaning the start of a new
 419               	;	frame).
 420               	;	Inputs:  none
 421               	;	Outputs: none
 422               	;***********************************************************
 423               	SIG_INTERRUPT0:
 424               	; This will wake us up when VSYNC transitions high...we just want to return
 425:CamInterfaceAsm.S **** 		reti
 426               			
 427               	;***********************************************************
 428               	;	Function Name: <interrupt handler for External Interrupt1> 
 429               	;	Function Description: This function is responsible
 430               	;	for handling a falling edge on the Ext Interrupt 1.  This
 431               	;	routine simply returns, since we just want to wake up
 432               	;	whenever the HREF transitions (meaning the pixels 
 433               	;	are starting after VSYNC transitioned, and we need to
 434               	; 	start acquiring the pixel blocks
 435               	;	Inputs:  none
 436               	;	Outputs: none
 437               	;***********************************************************	
 438               	SIG_INTERRUPT1:
 439               	; This will wake us up when HREF transitions high...we just want to return
 440:CamInterfaceAsm.S **** 		reti
 441               			
 442               	;***********************************************************
 443               	;	Function Name: <interrupt handler for Timer0 overflow>
 444               	;	Function Description: This function is responsible
 445               	;	for handling the Timer0 overflow (hooked up to indicate
 446               	;	when we have reached the number of HREFs required in a
 447               	;	single frame).  We set the T flag in the SREG to
 448               	;	indicate to the _acquirePixelBlock routine that it needs
 449               	;	to exit, and then set the appropriate action to take in
 450               	;	the eventList of the Executive module.
 451               	;	Inputs:  none
 452               	;	Outputs: none
 453               	;   Note: Originally, the HREF pulses were also going to
 454               	;   be counted by a hardware counter, but it didn't end up
 455               	;   being necessary
 456               	;***********************************************************
 457               	;SIG_OVERFLOW0:
 458               	;		set				; set the T bit in SREG
 459               	;		lds		tmp1,eventBitmask
 460               	;		ori		tmp1,EV_ACQUIRE_FRAME_COMPLETE
 461               	;		sts		eventBitmask,tmp1
 462               	;		reti
 463               			
 464               	;***********************************************************
 465               	;	Function Name: <interrupt handler for Timer1 overflow>
 466               	;	Function Description: This function is responsible
 467               	;	for handling the Timer1 overflow (hooked up to indicate
GAS LISTING /tmp/ccowxWMg.s 			page 30


 468               	;	when we have reached the end of a line of pixel data,
 469               	;	since PCLK is hooked up to overflow TCNT1 after 176 
 470               	;	pixels).  This routine generates an acquire line complete
 471               	;	event in the fastEventBitmask, which is streamlined for
 472               	;	efficiency reasons.
 473               	;***********************************************************
 474               	SIG_OVERFLOW1:				
 475:CamInterfaceAsm.S **** 		lds		tmp1,fastEventBitmask   		; set a flag indicating
 476:CamInterfaceAsm.S **** 		ori		tmp1,FEV_ACQUIRE_LINE_COMPLETE	; a line is complete
 477:CamInterfaceAsm.S **** 		sts		fastEventBitmask,tmp1
 478:CamInterfaceAsm.S **** 		set		; set the T bit in SREG 
 479               			;sbi		_SFR_IO_ADDR(PORTD),PD6 ; For testing...
 480               			;cbi		_SFR_IO_ADDR(PORTD),PD6 ; For testing...
 481               	
 482:CamInterfaceAsm.S **** 		reti
 483               	
 484               	; This is the default handler for all interrupts that don't
 485               	; have handler routines specified for them.
 486               	        .global __vector_default              
 487               	__vector_default:
 488:CamInterfaceAsm.S ****         reti
 489               	
 490               	        .end
GAS LISTING /tmp/ccowxWMg.s 			page 31


DEFINED SYMBOLS
                            *ABS*:00000000 CamInterfaceAsm.S
   CamInterfaceAsm.S:119    *ABS*:00000010 pixelCount
   CamInterfaceAsm.S:120    *ABS*:00000011 pixelRunStart
   CamInterfaceAsm.S:121    *ABS*:00000012 lastColor
   CamInterfaceAsm.S:122    *ABS*:00000013 tmp1
   CamInterfaceAsm.S:123    *ABS*:00000014 tmp2
   CamInterfaceAsm.S:124    *ABS*:00000013 color
   CamInterfaceAsm.S:125    *ABS*:00000014 greenData
   CamInterfaceAsm.S:126    *ABS*:00000015 blueData
   CamInterfaceAsm.S:127    *ABS*:00000016 colorMapLow
   CamInterfaceAsm.S:128    *ABS*:00000017 colorMapHigh
   CamInterfaceAsm.S:129    *ABS*:00000016 prevLineBuffLow
   CamInterfaceAsm.S:130    *ABS*:00000017 prevLineBuffHigh
   CamInterfaceAsm.S:131    *ABS*:00000018 currLineBuffLow
   CamInterfaceAsm.S:132    *ABS*:00000019 currLineBuffHigh
   CamInterfaceAsm.S:169    .text:00000000 CamIntAsm_waitForNewTrackingFrame
   CamInterfaceAsm.S:335    .text:0000008e CamIntAsm_waitForNewDumpFrame
   CamInterfaceAsm.S:345    .text:00000094 CamIntAsm_acquireDumpLine
   CamInterfaceAsm.S:179    .text:00000006 CamIntAsm_acquireTrackingLine
   CamInterfaceAsm.S:423    .text:000000d4 __vector_1
   CamInterfaceAsm.S:438    .text:000000d6 __vector_2
   CamInterfaceAsm.S:474    .text:000000d8 __vector_8
   CamInterfaceAsm.S:305    .text:00000080 _cleanUp
   CamInterfaceAsm.S:223    .text:00000034 _trackFrame
   CamInterfaceAsm.S:240    .text:00000044 _acquirePixelBlock
   CamInterfaceAsm.S:281    .text:00000074 _cleanUpTrackingLine
   CamInterfaceAsm.S:292    .text:00000080 _cleanUpDumpLine
   CamInterfaceAsm.S:316    .text:0000008c _exit
   CamInterfaceAsm.S:380    .text:000000ba _dumpFrame
   CamInterfaceAsm.S:400    .text:000000c8 _sampleDumpPixel
   CamInterfaceAsm.S:487    .text:000000e6 __vector_default

UNDEFINED SYMBOLS
__vector_9
fastEventBitmask
