<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.docbook.org/xml/4.4/docbookx.dtd"><article><articleinfo><title>Delay6sMono</title><revhistory><revision><revnumber>5</revnumber><date>2010-08-21 02:04:51</date><authorinitials>guest</authorinitials></revision><revision><revnumber>4</revnumber><date>2010-08-13 07:30:14</date><authorinitials>guest</authorinitials></revision><revision><revnumber>3</revnumber><date>2010-08-13 07:28:10</date><authorinitials>guest</authorinitials></revision><revision><revnumber>2</revnumber><date>2010-08-13 07:26:30</date><authorinitials>guest</authorinitials></revision><revision><revnumber>1</revnumber><date>2010-08-13 07:24:04</date><authorinitials>guest</authorinitials></revision></revhistory></articleinfo><section><title>MICrODEC: Stock Functions</title><section><title>6s Mono Delay</title><para>This program performs a simple delay routine.  It stores the incoming data from the codec, and plays back a delayed sample.  The input data is mono, and is taken from the left channel.  The output is also mono, and is presented on both the left and right channels.  However, if you're using a mono plug, you can only mix in the dry signal on the left channel (as there is no input signal on the right). </para><para>The pot (MOD1) controls the delay time.  It goes from 6ms to 6s.  MOD2 does nothing for this program.  Most analog delay pedals change the rate at which data is being clocked in and out, to change the delay time.  This gives a smooth change in audio when the delay is varied, although it also changes the frequency resolution of the signal.  To change the delay time in the MICrODEC, the easiest way is to just jump to the new delay time, although this gives an audible pop as the data abruptly switches.  In this program, we increment the delay time (or decrement it) at a rate of one sample per sample, until it matches what you want it to be.  This gives the effect of frequency doubling (or reversing) during delay transitions, which can be interesting sonically. </para><para><ulink url='http://wiki.openmusiclabs.com/wiki/Delay6sMono/wiki/Delay6sMono?action=AttachFile&amp;do=get&amp;target=delay_6s_mono.asm'>delay_6s_mono.asm</ulink> </para><!--rule (<hr>) is not applicable to DocBook--><programlisting startinglinenumber='1' language='highlight' linenumbering='numbered' format='linespecific'>
<lineannotation><![CDATA[; program: delay-18b-pot-mono.asm]]></lineannotation>
<lineannotation><![CDATA[; UID = 000033 - unique id to eliminate conflicts between variables]]></lineannotation>
<lineannotation><![CDATA[; 18b address space (6s delay time)]]></lineannotation>
<lineannotation><![CDATA[; mono data (left in only, output on left and right)]]></lineannotation>
<lineannotation><![CDATA[; pot (MOD1) controlled delay time (6ms - 6s)]]></lineannotation>

<lineannotation><![CDATA[; program overview]]></lineannotation>
<lineannotation><![CDATA[;]]></lineannotation>
<lineannotation><![CDATA[; data is read in from memory and written out the codec at the same time]]></lineannotation>
<lineannotation><![CDATA[; new data is written to the memory from the codec.  ADC0 (MOD1) is read]]></lineannotation>
<lineannotation><![CDATA[; and averaged over 256 samples to reduce jitter.  this value is subtracted]]></lineannotation>
<lineannotation><![CDATA[; from the write address to create the desired read address.  if the actual]]></lineannotation>
<lineannotation><![CDATA[; read address doesnt match the desired read address, it is either]]></lineannotation>
<lineannotation><![CDATA[; incremented or decremented by one sample each sample period until it]]></lineannotation>
<lineannotation><![CDATA[; matches.  this reduces noise during delay time transitions.]]></lineannotation>

<lineannotation><![CDATA[; register usage - may be redefined in other sections]]></lineannotation>
<lineannotation><![CDATA[;]]></lineannotation>
<lineannotation><![CDATA[; r0  desired delay time fractional byte]]></lineannotation>
<lineannotation><![CDATA[; r1  ]]></lineannotation>
<lineannotation><![CDATA[; r2  left/right lsb out]]></lineannotation>
<lineannotation><![CDATA[; r3  left/right msb out]]></lineannotation>
<lineannotation><![CDATA[; r4  ]]></lineannotation>
<lineannotation><![CDATA[; r5  ]]></lineannotation>
<lineannotation><![CDATA[; r6  left lsb in]]></lineannotation>
<lineannotation><![CDATA[; r7  left msb in]]></lineannotation>
<lineannotation><![CDATA[; r8  ]]></lineannotation>
<lineannotation><![CDATA[; r9  ]]></lineannotation>
<lineannotation><![CDATA[; r10 adc accumulator lsb]]></lineannotation>
<lineannotation><![CDATA[; r11 adc accumulator msb]]></lineannotation>
<lineannotation><![CDATA[; r12 actual delay lsb]]></lineannotation>
<lineannotation><![CDATA[; r13 actual delay msb]]></lineannotation>
<lineannotation><![CDATA[; r14 adc sample counter]]></lineannotation>
<lineannotation><![CDATA[; r15 switch sample counter]]></lineannotation>
<lineannotation><![CDATA[; r16 temporary swap register]]></lineannotation>
<lineannotation><![CDATA[; r17 temporary swap register]]></lineannotation>
<lineannotation><![CDATA[; r18 null register]]></lineannotation>
<lineannotation><![CDATA[; r19 adc accumulator fractional byte]]></lineannotation>
<lineannotation><![CDATA[; r20 temporary swap register]]></lineannotation>
<lineannotation><![CDATA[; r21 actual delay fractional byte]]></lineannotation>
<lineannotation><![CDATA[; r22 write address third byte]]></lineannotation>
<lineannotation><![CDATA[; r23 read address third byte]]></lineannotation>
<lineannotation><![CDATA[; r24 write address lsb]]></lineannotation>
<lineannotation><![CDATA[; r25 write address msb]]></lineannotation>
<lineannotation><![CDATA[; r26 desired delay lsb]]></lineannotation>
<lineannotation><![CDATA[; r27 desired delay msb]]></lineannotation>
<lineannotation><![CDATA[; r28 read address lsb]]></lineannotation>
<lineannotation><![CDATA[; r29 read address msb]]></lineannotation>
<lineannotation><![CDATA[; r30 jump location for interrupt lsb]]></lineannotation>
<lineannotation><![CDATA[; r31 jump location for interrupt msb]]></lineannotation>
<lineannotation><![CDATA[; t   ]]></lineannotation>

<lineannotation><![CDATA[;program starts here first time]]></lineannotation>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r30]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[23 ]]><lineannotation><![CDATA[; set jump location to program start]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r24]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; clear write register]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r25]]></methodname>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r22]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[00 ]]><lineannotation><![CDATA[; setup write address high byte]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; setup r18 as null register for carry addition and ddr setting]]></lineannotation>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><methodname><![CDATA[ff]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; setup r17 for ddr setting]]></lineannotation>

<methodname><![CDATA[clear_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; clear delay buffer]]></lineannotation>
<lineannotation><![CDATA[; eliminates static when first switching to the delay setting]]></lineannotation>

<methodname><![CDATA[adiw]]></methodname><![CDATA[ ]]><methodname><![CDATA[r25]]></methodname><![CDATA[:]]><methodname><![CDATA[r24]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[01 ]]><lineannotation><![CDATA[; increment write register]]></lineannotation>
<methodname><![CDATA[adc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r22]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; increment write third byte]]></lineannotation>
<methodname><![CDATA[cpi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r22]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[04 ]]><lineannotation><![CDATA[; check if full memory space has been cleared]]></lineannotation>
<methodname><![CDATA[breq]]></methodname><![CDATA[ ]]><token><![CDATA[cl]]></token><methodname><![CDATA[eardone_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; continue until end of buffer reached]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[portd]]></methodname><![CDATA[,]]><methodname><![CDATA[r24]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set address]]></lineannotation>
<methodname><![CDATA[sts]]></methodname><![CDATA[ ]]><methodname><![CDATA[porth]]></methodname><![CDATA[,]]><methodname><![CDATA[r25]]></methodname>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[portg]]></methodname><![CDATA[,]]><methodname><![CDATA[r22]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; pull ce low,we low,and set high bits of address]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[ddra]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set porta as output for data write]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[ddrc]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set portc as output for data write]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[porta]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set data]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[portc]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; r18 is cleared above]]></lineannotation>
<methodname><![CDATA[sbi]]></methodname><![CDATA[ ]]><methodname><![CDATA[portg]]></methodname><![CDATA[,]]><methodname><![CDATA[portg2]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; pull we high to write]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[ddra]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set porta as input for data lines]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[ddrc]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set portc as input for data lines]]></lineannotation>
<methodname><![CDATA[rjmp]]></methodname><![CDATA[ ]]><token><![CDATA[cl]]></token><methodname><![CDATA[ear_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; continue clearing]]></lineannotation>

<methodname><![CDATA[cleardone_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; reset registers]]></lineannotation>

<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r24]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; clear write register]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r25]]></methodname>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r22]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[00 ]]><lineannotation><![CDATA[; setup write address high byte]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r28]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set read address to minimum delay]]></lineannotation>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r29]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><methodname><![CDATA[ff]]></methodname>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r23]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[07 ]]><lineannotation><![CDATA[; setup read address high byte]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r21]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set actual delay time to minimum delay]]></lineannotation>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[01]]>
<methodname><![CDATA[mov]]></methodname><![CDATA[ ]]><methodname><![CDATA[r12]]></methodname><![CDATA[,]]><methodname><![CDATA[r16]]></methodname>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r13]]></methodname>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r2]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; initialize data output registers]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r3]]></methodname>
<methodname><![CDATA[reti]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; finish with initialization and wait for next interrupt]]></lineannotation>

<lineannotation><![CDATA[;program starts here every time but first]]></lineannotation>
<lineannotation><![CDATA[;initiate data transfer to codec]]></lineannotation>
<methodname><![CDATA[sbi]]></methodname><![CDATA[ ]]><methodname><![CDATA[portb]]></methodname><![CDATA[,]]><methodname><![CDATA[portb0]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; toggle slave select pin]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><token><![CDATA[sp]]></token><methodname><![CDATA[dr]]></methodname><![CDATA[,]]><methodname><![CDATA[r3]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; send out left channel msb]]></lineannotation>
<methodname><![CDATA[cbi]]></methodname><![CDATA[ ]]><methodname><![CDATA[portb]]></methodname><![CDATA[,]]><methodname><![CDATA[portb0]]></methodname>

<lineannotation><![CDATA[;increment sram addresses]]></lineannotation>
<methodname><![CDATA[adiw]]></methodname><![CDATA[ ]]><methodname><![CDATA[r25]]></methodname><![CDATA[:]]><methodname><![CDATA[r24]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[01 ]]><lineannotation><![CDATA[; increment write address]]></lineannotation>
<methodname><![CDATA[adc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r22]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; increment write third byte]]></lineannotation>
<methodname><![CDATA[andi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r22]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[03 ]]><lineannotation><![CDATA[; mask off unsed bits]]></lineannotation>
<methodname><![CDATA[adiw]]></methodname><![CDATA[ ]]><methodname><![CDATA[r29]]></methodname><![CDATA[:]]><methodname><![CDATA[r28]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[01 ]]><lineannotation><![CDATA[; increment read address]]></lineannotation>
<methodname><![CDATA[adc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r23]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; increment read third byte]]></lineannotation>
<methodname><![CDATA[andi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r23]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[03 ]]><lineannotation><![CDATA[; mask off unsed bits]]></lineannotation>
<methodname><![CDATA[ori]]></methodname><![CDATA[ ]]><methodname><![CDATA[r23]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[04 ]]><lineannotation><![CDATA[; set we bit for reading]]></lineannotation>

<methodname><![CDATA[wait1_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if byte has been sent]]></lineannotation>

<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[sr]]></methodname>
<methodname><![CDATA[sbrs]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[if]]></methodname>
<methodname><![CDATA[rjmp]]></methodname><![CDATA[ ]]><methodname><![CDATA[wait1_000033]]></methodname>
<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r7]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[dr]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; recieve in left channel msb]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><token><![CDATA[sp]]></token><methodname><![CDATA[dr]]></methodname><![CDATA[,]]><methodname><![CDATA[r2]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; send out left channel lsb]]></lineannotation>

<methodname><![CDATA[wait2_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if byte has been sent]]></lineannotation>

<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[sr]]></methodname>
<methodname><![CDATA[sbrs]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[if]]></methodname>
<methodname><![CDATA[rjmp]]></methodname><![CDATA[ ]]><methodname><![CDATA[wait2_000033]]></methodname>
<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r6]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[dr]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; recieve in left channel lsb]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><token><![CDATA[sp]]></token><methodname><![CDATA[dr]]></methodname><![CDATA[,]]><methodname><![CDATA[r3]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; send out right channel msb]]></lineannotation>

<lineannotation><![CDATA[;write left channel data to sram]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[portd]]></methodname><![CDATA[,]]><methodname><![CDATA[r24]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set address]]></lineannotation>
<methodname><![CDATA[sts]]></methodname><![CDATA[ ]]><methodname><![CDATA[porth]]></methodname><![CDATA[,]]><methodname><![CDATA[r25]]></methodname>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[portg]]></methodname><![CDATA[,]]><methodname><![CDATA[r22]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; pull ce low,we low,and set high bits of address]]></lineannotation>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><methodname><![CDATA[ff]]></methodname>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[ddra]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set porta as output for data write]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[ddrc]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set portc as output for data write]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[porta]]></methodname><![CDATA[,]]><methodname><![CDATA[r6]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set data]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[portc]]></methodname><![CDATA[,]]><methodname><![CDATA[r7]]></methodname>
<methodname><![CDATA[sbi]]></methodname><![CDATA[ ]]><methodname><![CDATA[portg]]></methodname><![CDATA[,]]><methodname><![CDATA[portg2]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; pull we high to write]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[ddra]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set porta as input for data lines]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[ddrc]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set portc as input for data lines]]></lineannotation>

<methodname><![CDATA[wait3_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if byte has been sent]]></lineannotation>

<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[sr]]></methodname>
<methodname><![CDATA[sbrs]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[if]]></methodname>
<methodname><![CDATA[rjmp]]></methodname><![CDATA[ ]]><methodname><![CDATA[wait3_000033]]></methodname>
<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r9]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[dr]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; recieve in right channel msb]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><token><![CDATA[sp]]></token><methodname><![CDATA[dr]]></methodname><![CDATA[,]]><methodname><![CDATA[r2]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; send out right channel lsb]]></lineannotation>

<lineannotation><![CDATA[;get left channel data from sram]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[portg]]></methodname><![CDATA[,]]><methodname><![CDATA[r23]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; pull ce low,we high,oe low, and set high bits of address]]></lineannotation>
<methodname><![CDATA[out]]></methodname><![CDATA[ ]]><methodname><![CDATA[portd]]></methodname><![CDATA[,]]><methodname><![CDATA[r28]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set address]]></lineannotation>
<methodname><![CDATA[sts]]></methodname><![CDATA[ ]]><methodname><![CDATA[porth]]></methodname><![CDATA[,]]><methodname><![CDATA[r29]]></methodname>
<methodname><![CDATA[nop]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; wait microcontroller setup time of 2 cycles]]></lineannotation>
<methodname><![CDATA[nop]]></methodname>
<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r2]]></methodname><![CDATA[,]]><methodname><![CDATA[pina]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; get data]]></lineannotation>
<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r3]]></methodname><![CDATA[,]]><methodname><![CDATA[pinc]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; get data]]></lineannotation>

<methodname><![CDATA[wait4_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if byte has been sent]]></lineannotation>

<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[sr]]></methodname>
<methodname><![CDATA[sbrs]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[if]]></methodname>
<methodname><![CDATA[rjmp]]></methodname><![CDATA[ ]]><methodname><![CDATA[wait4_000033]]></methodname>
<methodname><![CDATA[in]]></methodname><![CDATA[ ]]><methodname><![CDATA[r8]]></methodname><![CDATA[,]]><token><![CDATA[sp]]></token><methodname><![CDATA[dr]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; recieve in left channel lsb]]></lineannotation>

<lineannotation><![CDATA[; get delay settings]]></lineannotation>
<methodname><![CDATA[lds]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><methodname><![CDATA[adcsra]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; get adc control register]]></lineannotation>
<methodname><![CDATA[sbrs]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><methodname><![CDATA[adif]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if adc conversion is complete]]></lineannotation>
<methodname><![CDATA[rjmp]]></methodname><![CDATA[ ]]><methodname><![CDATA[shift_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; skip adc sampling]]></lineannotation>
<methodname><![CDATA[lds]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><methodname><![CDATA[adcl]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; get low byte adc value]]></lineannotation>
<methodname><![CDATA[lds]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><methodname><![CDATA[adch]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; get high byte adc value]]></lineannotation>
<methodname><![CDATA[add]]></methodname><![CDATA[ ]]><methodname><![CDATA[r19]]></methodname><![CDATA[,]]><methodname><![CDATA[r16]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; accumulate adc samples]]></lineannotation>
<methodname><![CDATA[adc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r10]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname>
<methodname><![CDATA[adc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r11]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; r18 is cleared above]]></lineannotation>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><methodname><![CDATA[f7]]></methodname>
<methodname><![CDATA[sts]]></methodname><![CDATA[ ]]><methodname><![CDATA[adcsra]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; clear interrupt flag]]></lineannotation>
<methodname><![CDATA[dec]]></methodname><![CDATA[ ]]><methodname><![CDATA[r14]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; countdown adc sample clock]]></lineannotation>
<methodname><![CDATA[brne]]></methodname><![CDATA[ ]]><methodname><![CDATA[shift_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; get delay time if its been long enough]]></lineannotation>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[01 ]]><lineannotation><![CDATA[; check if adc value is less than $000100]]></lineannotation>
<methodname><![CDATA[cp]]></methodname><![CDATA[ ]]><methodname><![CDATA[r19]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; r18 is cleared above]]></lineannotation>
<methodname><![CDATA[cpc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r10]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname>
<methodname><![CDATA[cpc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r11]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname>
<methodname><![CDATA[brsh]]></methodname><![CDATA[ ]]><methodname><![CDATA[deadband_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if adc value changed enough to update delay]]></lineannotation>
<methodname><![CDATA[inc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r10]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; set minimum delay to $000100 = 6ms]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r19]]></methodname>

<methodname><![CDATA[deadband_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check for change in adc value]]></lineannotation>

<methodname><![CDATA[movw]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[:]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><methodname><![CDATA[r11]]></methodname><![CDATA[:]]><methodname><![CDATA[r10]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; move adc sample to temporary register]]></lineannotation>
<methodname><![CDATA[mov]]></methodname><![CDATA[ ]]><methodname><![CDATA[r20]]></methodname><![CDATA[,]]><methodname><![CDATA[r19]]></methodname>
<methodname><![CDATA[sub]]></methodname><![CDATA[ ]]><methodname><![CDATA[r20]]></methodname><![CDATA[,]]><methodname><![CDATA[r0]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; find difference between adc sample and desired delay time]]></lineannotation>
<methodname><![CDATA[sbc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><methodname><![CDATA[r26]]></methodname>
<methodname><![CDATA[sbc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><methodname><![CDATA[r27]]></methodname>
<methodname><![CDATA[brsh]]></methodname><![CDATA[ ]]><token><![CDATA[ch]]></token><methodname><![CDATA[eck_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check for deadband if positive]]></lineannotation>
<methodname><![CDATA[com]]></methodname><![CDATA[ ]]><methodname><![CDATA[r20]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; invert if negative]]></lineannotation>
<methodname><![CDATA[com]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; using ones complement as it is faster, and only has 1 bit error]]></lineannotation>
<methodname><![CDATA[com]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname>

<methodname><![CDATA[check_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if difference is greater than deadband]]></lineannotation>

<methodname><![CDATA[cpi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[01 ]]><lineannotation><![CDATA[; check if difference is less than 1 lsb]]></lineannotation>
<methodname><![CDATA[cpc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; r18 cleared above]]></lineannotation>
<methodname><![CDATA[brlo]]></methodname><![CDATA[ ]]><methodname><![CDATA[empty_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; do nothing if less than 1 lsb]]></lineannotation>
<methodname><![CDATA[movw]]></methodname><![CDATA[ ]]><methodname><![CDATA[r27]]></methodname><![CDATA[:]]><methodname><![CDATA[r26]]></methodname><![CDATA[,]]><methodname><![CDATA[r11]]></methodname><![CDATA[:]]><methodname><![CDATA[r10]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; move adc sample to delay time if large enough change]]></lineannotation>
<methodname><![CDATA[andi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r19]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><methodname><![CDATA[fe]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; make sure delay time is even]]></lineannotation>
<methodname><![CDATA[mov]]></methodname><![CDATA[ ]]><methodname><![CDATA[r0]]></methodname><![CDATA[,]]><methodname><![CDATA[r19]]></methodname>

<methodname><![CDATA[empty_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; empty accumulation registers and finish off]]></lineannotation>

<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r10]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; empty accumulation registers]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r11]]></methodname>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r19]]></methodname>

<methodname><![CDATA[shift_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if delay time is correct]]></lineannotation>

<methodname><![CDATA[cp]]></methodname><![CDATA[ ]]><methodname><![CDATA[r0]]></methodname><![CDATA[,]]><methodname><![CDATA[r21]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; compare desired delay to actual delay]]></lineannotation>
<methodname><![CDATA[cpc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r26]]></methodname><![CDATA[,]]><methodname><![CDATA[r12]]></methodname>
<methodname><![CDATA[cpc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r27]]></methodname><![CDATA[,]]><methodname><![CDATA[r13]]></methodname>
<methodname><![CDATA[breq]]></methodname><![CDATA[ ]]><methodname><![CDATA[switchsample_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; do nothing if the same]]></lineannotation>
<methodname><![CDATA[brlo]]></methodname><![CDATA[ ]]><methodname><![CDATA[indexdown_000033]]></methodname>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[02 ]]><lineannotation><![CDATA[; increment delay register]]></lineannotation>
<methodname><![CDATA[add]]></methodname><![CDATA[ ]]><methodname><![CDATA[r21]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; this doubles playback speed until desired delay is reached]]></lineannotation>
<methodname><![CDATA[adc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r12]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; r18 is cleared above]]></lineannotation>
<methodname><![CDATA[adc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r13]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[03]]>
<methodname><![CDATA[and]]></methodname><![CDATA[ ]]><methodname><![CDATA[r13]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; mask off unused bits]]></lineannotation>
<methodname><![CDATA[rjmp]]></methodname><![CDATA[ ]]><methodname><![CDATA[switchsample_000033]]></methodname>

<methodname><![CDATA[indexdown_000033:]]></methodname>

<methodname><![CDATA[subi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r21]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[01 ]]><lineannotation><![CDATA[; decrement delay register]]></lineannotation>
<methodname><![CDATA[sbc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r12]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; r18 is cleared above]]></lineannotation>
<methodname><![CDATA[sbc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r13]]></methodname><![CDATA[,]]><methodname><![CDATA[r18]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; this plays backwards until desired delay is reached]]></lineannotation>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[03]]>
<methodname><![CDATA[and]]></methodname><![CDATA[ ]]><methodname><![CDATA[r13]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; mask off unused bits]]></lineannotation>

<methodname><![CDATA[switchsample_000033:]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check state of rotary switch]]></lineannotation>

<methodname><![CDATA[dec]]></methodname><![CDATA[ ]]><methodname><![CDATA[r15]]></methodname>
<methodname><![CDATA[brne]]></methodname><![CDATA[ ]]><methodname><![CDATA[done_000033]]></methodname>
<methodname><![CDATA[lds]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><methodname><![CDATA[pinj]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; get switch data]]></lineannotation>
<methodname><![CDATA[andi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[78 ]]><lineannotation><![CDATA[; mask off rotary switch]]></lineannotation>
<methodname><![CDATA[lsr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[  ]]><lineannotation><![CDATA[; adjust switch position to program memory location]]></lineannotation>
<methodname><![CDATA[lsr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname>
<methodname><![CDATA[ldi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r17]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[02]]>
<methodname><![CDATA[add]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><methodname><![CDATA[r17]]></methodname>
<methodname><![CDATA[cp]]></methodname><![CDATA[ ]]><methodname><![CDATA[r16]]></methodname><![CDATA[,]]><methodname><![CDATA[r31]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; check if location has changed]]></lineannotation>
<methodname><![CDATA[breq]]></methodname><![CDATA[ ]]><methodname><![CDATA[done_000033]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; finish off if no change]]></lineannotation>
<methodname><![CDATA[clr]]></methodname><![CDATA[ ]]><methodname><![CDATA[r30]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; reset jump register to new function if it changed]]></lineannotation>
<methodname><![CDATA[mov]]></methodname><![CDATA[ ]]><methodname><![CDATA[r31]]></methodname><![CDATA[,]]><methodname><![CDATA[r16]]></methodname>

<methodname><![CDATA[done_000033:]]></methodname>

<methodname><![CDATA[movw]]></methodname><![CDATA[ ]]><methodname><![CDATA[r29]]></methodname><![CDATA[:]]><methodname><![CDATA[r28]]></methodname><![CDATA[,]]><methodname><![CDATA[r25]]></methodname><![CDATA[:]]><methodname><![CDATA[r24]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; move write address to read destination register]]></lineannotation>
<methodname><![CDATA[mov]]></methodname><![CDATA[ ]]><methodname><![CDATA[r23]]></methodname><![CDATA[,]]><methodname><![CDATA[r22]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; move write third byte to read third byte]]></lineannotation>
<methodname><![CDATA[sub]]></methodname><![CDATA[ ]]><methodname><![CDATA[r28]]></methodname><![CDATA[,]]><methodname><![CDATA[r21]]></methodname><![CDATA[ ]]><lineannotation><![CDATA[; subtract delay time]]></lineannotation>
<methodname><![CDATA[sbc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r29]]></methodname><![CDATA[,]]><methodname><![CDATA[r12]]></methodname>
<methodname><![CDATA[sbc]]></methodname><![CDATA[ ]]><methodname><![CDATA[r23]]></methodname><![CDATA[,]]><methodname><![CDATA[r13]]></methodname>
<methodname><![CDATA[andi]]></methodname><![CDATA[ ]]><methodname><![CDATA[r23]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[03 ]]><lineannotation><![CDATA[; mask off unsed bits]]></lineannotation>
<methodname><![CDATA[ori]]></methodname><![CDATA[ ]]><methodname><![CDATA[r23]]></methodname><![CDATA[,]]><symbol><![CDATA[$]]></symbol><![CDATA[04 ]]><lineannotation><![CDATA[; set we bit for reading]]></lineannotation>
<methodname><![CDATA[reti]]></methodname>
</programlisting></section></section></article>