|
2 | 2 | * pix.c |
3 | 3 | * This file is part of litepix |
4 | 4 | * |
5 | | - * Copyright (C) 2014, 2015 - Florian Rommel |
| 5 | + * Copyright (C) 2014, 2015 - Florian Rommel, Michael Nieß |
6 | 6 | * |
7 | 7 | * litepix is free software; you can redistribute it and/or modify |
8 | 8 | * it under the terms of the GNU General Public License as published by |
|
27 | 27 |
|
28 | 28 | #define OUT_PORT (PORTB) |
29 | 29 | #define OUT_DR (DDRB) |
30 | | -#define OUT_PIN_1 (PB0) |
31 | | -#define OUT_PIN_2 (PB1) |
32 | | -#define OUT_PIN_3 (PB2) |
33 | | - |
34 | | -#define START_1 (0) |
35 | | -#define START_2 (PIX_NUM_BYTES/3) |
36 | | -#define START_3 (PIX_NUM_BYTES/3*2) |
37 | | - |
| 30 | +#define OUT_PIN (PB4) |
38 | 31 |
|
| 32 | +#define START (0) |
39 | 33 | uint8_t pix_canvas[PIX_NUM_BYTES] = {0}; |
40 | 34 |
|
41 | | - |
42 | | -static void rearrange(void) { |
43 | | - uint8_t *ps = &pix_canvas[60]; |
44 | | - uint8_t *pe = &pix_canvas[120]; |
45 | | - |
46 | | - asm ( |
47 | | - " ldi r18, 10\n\t" |
48 | | - " ldi r19, 6\n\t" |
49 | | - |
50 | | - "rearr: ld r20, %a[ps]\n\t" |
51 | | - " ldd r21, %a[ps]+1\n\t" |
52 | | - " ldd r22, %a[ps]+2\n\t" |
53 | | - " ld r25, -%a[pe]\n\t" |
54 | | - " ld r24, -%a[pe]\n\t" |
55 | | - " ld r23, -%a[pe]\n\t" |
56 | | - " st %a[pe], r20\n\t" |
57 | | - " std %a[pe]+1, r21\n\t" |
58 | | - " std %a[pe]+2, r22\n\t" |
59 | | - " st %a[ps]+, r23\n\t" |
60 | | - " st %a[ps]+, r24\n\t" |
61 | | - " st %a[ps]+, r25\n\t" |
62 | | - " dec r18\n\t" |
63 | | - " brne rearr\n\t" |
64 | | - " subi r28,-90\n\t" //TODO |
65 | | - " sbci r29,-1\n\t" |
66 | | - " subi r30,-150\n\t" //TODO |
67 | | - " sbci r31,-1\n\t" |
68 | | - " ldi r18, 10\n\t" |
69 | | - " dec r19\n\t" |
70 | | - " brne rearr\n\t" |
71 | | - :: |
72 | | - [ps] "y" (ps), |
73 | | - [pe] "z" (pe) |
74 | | - : "r18", "r19", "r20", "r21", |
75 | | - "r22", "r23", "r24", "r25" |
76 | | - ); |
| 35 | +//switch pixel 3 with 5 |
| 36 | +static void rearrange(void) { |
| 37 | + uint8_t tmp1 = pix_canvas[9]; |
| 38 | + uint8_t tmp2 = pix_canvas[10]; |
| 39 | + uint8_t tmp3 = pix_canvas[11]; |
| 40 | + pix_canvas[9] = pix_canvas[15]; |
| 41 | + pix_canvas[10] = pix_canvas[16]; |
| 42 | + pix_canvas[11] = pix_canvas[17]; |
| 43 | + pix_canvas[15] = tmp1; |
| 44 | + pix_canvas[16] = tmp2; |
| 45 | + pix_canvas[17] = tmp3; |
77 | 46 | } |
78 | 47 |
|
79 | 48 |
|
80 | 49 | void init_pix(void) { |
81 | | - OUT_DR |= (1 << OUT_PIN_1); |
82 | | - OUT_DR |= (1 << OUT_PIN_2); |
83 | | - OUT_DR |= (1 << OUT_PIN_3); |
84 | | - OUT_PORT &= ~(1 << OUT_PIN_1); |
85 | | - OUT_PORT &= ~(1 << OUT_PIN_2); |
86 | | - OUT_PORT &= ~(1 << OUT_PIN_3); |
| 50 | + OUT_DR |= (1 << OUT_PIN); |
| 51 | + OUT_PORT &= ~(1 << OUT_PIN); |
87 | 52 | } |
88 | 53 |
|
89 | | - |
90 | 54 | void pix_render(void) { |
91 | | - rearrange(); |
92 | | - |
| 55 | + rearrange(); |
93 | 56 | uint8_t tmp_sreg = SREG; |
94 | 57 | cli(); |
95 | 58 |
|
96 | | - uint8_t *p1 = &pix_canvas[START_1]; |
97 | | - uint8_t *p2 = &pix_canvas[START_2]; |
98 | | - uint8_t *p3 = &pix_canvas[START_3]; |
99 | | - uint8_t d1 = *p1++; |
100 | | - uint8_t d2 = *p2++; |
101 | | - uint8_t d3 = *p3++; |
| 59 | + uint8_t *p = &pix_canvas[START]; |
| 60 | + uint8_t d = *p++; |
102 | 61 |
|
103 | | - const uint8_t mask = _BV(OUT_PIN_1) | _BV(OUT_PIN_2) | _BV(OUT_PIN_3); |
| 62 | + const uint8_t mask = _BV(OUT_PIN); |
104 | 63 | const uint8_t low = OUT_PORT & (~mask); |
105 | 64 | const uint8_t high = OUT_PORT | mask; |
106 | 65 |
|
107 | 66 | uint8_t nbits = 7; |
108 | 67 | uint8_t tmp = low; |
109 | | - uint16_t nbytes = PIX_NUM_BYTES/3; |
| 68 | + uint8_t nbytes = PIX_NUM_BYTES; |
110 | 69 |
|
111 | 70 | asm volatile( |
112 | | - "start: nop\n\t" |
113 | | - " nop\n\t" |
114 | | - " nop\n\t" |
115 | | - "set1: out %[ioport], %[portdown]\n\t" |
116 | | - " lsl %[data1]\n\t" |
117 | | - " brcc a1\n\t" |
118 | | - " sbr %[tmp], %[bit1]\n\t" |
119 | | - "a1: lsl %[data2]\n\t" |
120 | | - " brcc a2\n\t" |
121 | | - " sbr %[tmp], %[bit2]\n\t" |
122 | | - "a2: out %[ioport], %[portup]\n\t" |
123 | | - " lsl %[data3]\n\t" |
124 | | - " brcc a3\n\t" |
125 | | - " sbr %[tmp], %[bit3]\n\t" |
126 | | - "a3: nop\n\t" |
127 | | - " dec %[bitcount]\n\t" |
128 | | - "set0: out %[ioport], %[tmp] \n\t" |
129 | | - " mov %[tmp], %[portdown]\n\t" |
130 | | - " brne start\n\t" |
131 | | - |
132 | | - " lsl %[data1]\n\t" |
133 | | - " brcc b1\n\t" |
134 | | - " sbr %[tmp], %[bit1]\n\t" |
135 | | - "b1: lsl %[data2]\n\t" |
136 | | - " out %[ioport], %[portdown]\n\t" |
137 | | - " brcc b2\n\t" |
138 | | - " sbr %[tmp], %[bit2]\n\t" |
139 | | - "b2: ld %[data1], %a[ptr1]+\n\t" |
| 71 | + "set1: out %[ioport], %[portdown]\n\t" |
| 72 | + " lsl %[data1]\n\t" |
| 73 | + " brcc a1\n\t" |
| 74 | + " sbr %[tmp], %[bit1]\n\t" |
| 75 | + "a1: out %[ioport], %[portup]\n\t" |
| 76 | + " nop\n\t" |
| 77 | + " dec %[bitcount]\n\t" |
| 78 | + "set0: out %[ioport], %[tmp]\n\t" |
| 79 | + " mov %[tmp], %[portdown]\n\t" |
| 80 | + " brne set1\n\t" |
| 81 | + " nop\n\t" |
| 82 | + "b1: out %[ioport], %[portdown]\n\t" |
| 83 | + " lsl %[data1]\n\t" |
| 84 | + " brcc b2\n\t" |
| 85 | + " sbr %[tmp], %[bit1]\n\t" |
| 86 | + "b2: ld %[data1], %a[ptr1]+\n\t" |
140 | 87 | // ^^^ |
141 | | - " ld %[data2], %a[ptr2]+\n\t" |
142 | | - // ^^^ |
143 | | - " out %[ioport], %[portup]\n\t" |
144 | | - " lsl %[data3]\n\t" |
145 | | - " brcc b3\n\t" |
146 | | - " sbr %[tmp], %[bit3]\n\t" |
147 | | - "b3: ld %[data3], %a[ptr3]+\n\t" |
148 | | - // ^^^ |
149 | | - " out %[ioport], %[tmp] \n\t" |
150 | | - " ldi %[bitcount], 7\n\t" |
| 88 | + " nop\n\t" |
| 89 | + " out %[ioport], %[portup]\n\t" |
| 90 | + " nop\n\t" |
| 91 | + " nop\n\t" |
| 92 | + "b3: ldi %[bitcount], 7\n\t" |
| 93 | + " out %[ioport], %[tmp]\n\t" |
151 | 94 | " mov %[tmp], %[portdown]\n\t" |
152 | | - " sbiw %[bytecount], 1\n\t" |
153 | | - // ^^^ |
154 | | - " brne set1\n\t" |
155 | | - |
156 | | - " nop\n\t" |
| 95 | + " subi %[bytecount], 1\n\t" |
| 96 | + " brne set1\n\t" |
157 | 97 | " out %[ioport], %[portdown]\n\t" |
158 | 98 | :: |
159 | 99 | [ioport] "I" (_SFR_IO_ADDR(OUT_PORT)), |
160 | 100 | [portup] "l" (high), |
161 | 101 | [portdown] "l" (low), |
162 | 102 | [bitcount] "d" (nbits), |
163 | | - [ptr1] "e" (p1), |
164 | | - [ptr2] "e" (p2), |
165 | | - [ptr3] "e" (p3), |
166 | | - [data1] "d" (d1), |
167 | | - [data2] "d" (d2), |
168 | | - [data3] "d" (d3), |
169 | | - [bit1] "I" (1 << OUT_PIN_1), |
170 | | - [bit2] "I" (1 << OUT_PIN_2), |
171 | | - [bit3] "I" (1 << OUT_PIN_3), |
| 103 | + [ptr1] "e" (p), |
| 104 | + [data1] "d" (d), |
| 105 | + [bit1] "I" (1 << OUT_PIN), |
172 | 106 | [tmp] "d" (tmp), |
173 | | - [bytecount] "w" (nbytes) |
| 107 | + [bytecount] "d" (nbytes) |
174 | 108 | ); |
175 | 109 |
|
176 | 110 | SREG = tmp_sreg; |
|
0 commit comments