1 | WORD wCounter0, wCounter1;
|
2 | WORD wStepsize0, wStepsize1;
|
3 | BYTE cPos0, cPos1;
|
4 | WORD i = DMA_BUFFER_SIZE;
|
5 |
|
6 | asm (
|
7 | /*variablen laden*/
|
8 | "lds %A[C0], %[AC0] \n\t" //Counter 0 laden
|
9 | "lds %B[C0], %[AC0]+1 \n\t" //..
|
10 | "lds %A[C1], %[AC1] \n\t" //Counter 1 laden
|
11 | "lds %B[C1], %[AC1]+1 \n\t" //..
|
12 | "lds %A[S0], %[AS0] \n\t" //Stepsize 0 laden
|
13 | "lds %B[S0], %[AS0]+1 \n\t" //..
|
14 | "lds %A[S1], %[AS1] \n\t" //Stepsize 1 laden
|
15 | "lds %B[S1], %[AS1]+1 \n\t" //..
|
16 | "lds %[P0], %[AP0] \n\t" //Position 0 laden
|
17 | "lds %[P1], %[AP1] \n\t" //Position 1 laden
|
18 |
|
19 | /*Vorberechnung ausführen*/
|
20 | "REPEAT: \n\t"
|
21 | "add %B[C0], %B[S0] \n\t" //Stepsize addieren
|
22 | "adc %A[C0], %A[S0] \n\t" //... hier mit carry
|
23 | "mov __tmp_reg__, %A[C0] \n\t" //Counter high temporär kopieren
|
24 | "andi %A[C0], 0x03 \n\t" //Module 1024 auf Counter
|
25 | "lsr __tmp_reg__ \n\t" //Kopie /2 (eigentlich durch 1024, aber die unteren 8 Byte sind ja schon gelöscht)
|
26 | "lsr __tmp_reg__ \n\t" //kopie /2
|
27 | "add %[P0], __tmp_reg__ \n\t" //Addition zur Position
|
28 | "add %B[C1], %B[S1] \n\t" //Stepsize addieren
|
29 | "adc %A[C1], %A[S1] \n\t" //... hier mit carry
|
30 | "mov __tmp_reg__, %A[C1] \n\t" //Counter high temporär kopieren
|
31 | "andi %A[C1], 0x03 \n\t" //Module 1024 auf Counter
|
32 | "lsr __tmp_reg__ \n\t" //Kopie /2 (eigentlich durch 1024, aber die unteren 8 Byte sind ja schon gelöscht)
|
33 | "lsr __tmp_reg__ \n\t" //kopie /2
|
34 | "add %[P1], __tmp_reg__ \n\t" //Addition zur Position
|
35 |
|
36 | "st X+, __tmp_reg__ \n\t" //Highbyte speichern
|
37 | "st X+, __tmp_reg__ \n\t" //Lowbyte speichern
|
38 |
|
39 | "sbiw %[I], 1 \n\t" //Schelife - 1
|
40 | "brne REPEAT \n\t"
|
41 |
|
42 | /*variablen speichern*/
|
43 | "sts %[AC0],%A[C0] \n\t" //Counter 0 speichern
|
44 | "sts %[AC0]+1,%B[C0] \n\t" //..
|
45 | "sts %[AC1],%A[C1] \n\t" //Counter 1 speichern
|
46 | "sts %[AC1]+1,%B[C1] \n\t" //..
|
47 | "sts %[AP0],%[P0] \n\t" //Position 0 speichern
|
48 | "sts %[AP1],%[P1] \n\t" //Position 1 speichern
|
49 |
|
50 | : [C0] "=r" (wCounter0)
|
51 | , [C1] "=r" (wCounter1)
|
52 | , [S0] "=r" (wStepsize0)
|
53 | , [S1] "=r" (wStepsize1)
|
54 | , [P0] "=r" (cPos0)
|
55 | , [P1] "=r" (cPos1)
|
56 | , [I] "=r" (i)
|
57 | : [AC0] "i" (&g_asToene[0].wCounter)
|
58 | , [AC1] "i" (&g_asToene[1].wCounter)
|
59 | , [AS0] "i" (&g_asToene[0].wStepSize)
|
60 | , [AS1] "i" (&g_asToene[1].wStepSize)
|
61 | , [AP0] "i" (&g_asToene[0].cPos)
|
62 | , [AP1] "i" (&g_asToene[1].cPos)
|
63 | , [DM] "i" (&g_DmaBuffer2[0])
|
64 | , [SAMPLE] "i" (&g_awSample[0])
|
65 | : "memory"
|
66 | );
|