33#include < Arduino.h>
44#include " pins_arduino.h"
55
6+ #define NOP asm volatile (" nop" )
7+ #define NOP5 asm volatile (" nop\n nop\n nop\n nop\n nop\n " )
8+ #define NOP30 asm volatile (" nop\n nop\n nop\n nop\n nop\n " \
9+ " nop\n nop\n nop\n nop\n nop\n " \
10+ " nop\n nop\n nop\n nop\n nop\n " \
11+ " nop\n nop\n nop\n nop\n nop\n " \
12+ " nop\n nop\n nop\n nop\n nop\n " \
13+ " nop\n nop\n nop\n nop\n nop\n " )
14+
615// these two macros set arduino pin 2 to input or output, which with an
716// external 1K pull-up resistor to the 3.3V rail, is like pulling it high or
817// low. These operations translate to 1 op code, which takes 2 cycles
@@ -149,35 +158,22 @@ void N64Controller::N64_PIND_send(char pincode, unsigned char *buffer, char leng
149158 // 1 bit
150159 // remain low for 1us, then go high for 3us
151160 // nop block 1
152- asm volatile ( " nop \n nop \n nop \n nop \n nop \n " ) ;
161+ NOP5 ;
153162
154163 asm volatile (" ;Setting line to high" );
155164 N64_PIND_HIGH;
156165
157166 // nop block 2
158167 // we'll wait only 2us to sync up with both conditions
159168 // at the bottom of the if statement
160- asm volatile (" nop\n nop\n nop\n nop\n nop\n "
161- " nop\n nop\n nop\n nop\n nop\n "
162- " nop\n nop\n nop\n nop\n nop\n "
163- " nop\n nop\n nop\n nop\n nop\n "
164- " nop\n nop\n nop\n nop\n nop\n "
165- " nop\n nop\n nop\n nop\n nop\n "
166- );
169+ NOP30;
167170
168171 } else {
169172 asm volatile (" ;Bit is a 0" );
170173 // 0 bit
171174 // remain low for 3us, then go high for 1us
172175 // nop block 3
173- asm volatile (" nop\n nop\n nop\n nop\n nop\n "
174- " nop\n nop\n nop\n nop\n nop\n "
175- " nop\n nop\n nop\n nop\n nop\n "
176- " nop\n nop\n nop\n nop\n nop\n "
177- " nop\n nop\n nop\n nop\n nop\n "
178- " nop\n nop\n nop\n nop\n nop\n "
179- " nop\n nop\n nop\n nop\n nop\n "
180- " nop\n " );
176+ NOP30; NOP5; NOP;
181177
182178 asm volatile (" ;Setting line to high" );
183179 N64_PIND_HIGH;
@@ -195,8 +191,8 @@ void N64Controller::N64_PIND_send(char pincode, unsigned char *buffer, char leng
195191 if (bits != 0 ) {
196192 // nop block 4
197193 // this block is why a for loop was impossible
198- asm volatile ( " nop \n nop \n nop \n nop \n nop \n "
199- " nop \n nop \n nop \n nop \n " );
194+ NOP5; NOP; NOP; NOP; NOP;
195+
200196 // rotate bits
201197 asm volatile (" ;rotating out bits" );
202198 *buffer <<= 1 ;
@@ -222,9 +218,8 @@ void N64Controller::N64_PIND_send(char pincode, unsigned char *buffer, char leng
222218 // wait 1 us, 16 cycles, then raise the line
223219 // 16-2=14
224220 // nop block 6
225- asm volatile (" nop\n nop\n nop\n nop\n nop\n "
226- " nop\n nop\n nop\n nop\n nop\n "
227- " nop\n nop\n nop\n nop\n " );
221+ NOP5; NOP5; NOP; NOP; NOP; NOP;
222+
228223 N64_PIND_HIGH;
229224
230225}
@@ -244,26 +239,13 @@ void N64Controller::N64_PINB_send(char pincode, unsigned char *buffer, char leng
244239 asm volatile (" ;branching" );
245240 if (*buffer >> 7 ) {
246241 asm volatile (" ;Bit is a 1" );
247- asm volatile ( " nop \n nop \n nop \n nop \n nop \n " ) ;
242+ NOP5 ;
248243 asm volatile (" ;Setting line to high" );
249244 N64_PINB_HIGH;
250- asm volatile (" nop\n nop\n nop\n nop\n nop\n "
251- " nop\n nop\n nop\n nop\n nop\n "
252- " nop\n nop\n nop\n nop\n nop\n "
253- " nop\n nop\n nop\n nop\n nop\n "
254- " nop\n nop\n nop\n nop\n nop\n "
255- " nop\n nop\n nop\n nop\n nop\n "
256- );
245+ NOP30;
257246 } else {
258247 asm volatile (" ;Bit is a 0" );
259- asm volatile (" nop\n nop\n nop\n nop\n nop\n "
260- " nop\n nop\n nop\n nop\n nop\n "
261- " nop\n nop\n nop\n nop\n nop\n "
262- " nop\n nop\n nop\n nop\n nop\n "
263- " nop\n nop\n nop\n nop\n nop\n "
264- " nop\n nop\n nop\n nop\n nop\n "
265- " nop\n nop\n nop\n nop\n nop\n "
266- " nop\n " );
248+ NOP30; NOP5; NOP;
267249
268250 asm volatile (" ;Setting line to high" );
269251 N64_PINB_HIGH;
@@ -272,8 +254,7 @@ void N64Controller::N64_PINB_send(char pincode, unsigned char *buffer, char leng
272254 asm volatile (" ;finishing inner loop body" );
273255 --bits;
274256 if (bits != 0 ) {
275- asm volatile (" nop\n nop\n nop\n nop\n nop\n "
276- " nop\n nop\n nop\n nop\n " );
257+ NOP5; NOP; NOP; NOP; NOP;
277258 asm volatile (" ;rotating out bits" );
278259 *buffer <<= 1 ;
279260 goto inner_loop;
@@ -286,11 +267,9 @@ void N64Controller::N64_PINB_send(char pincode, unsigned char *buffer, char leng
286267 goto outer_loop;
287268 }
288269 }
289- asm volatile ( " nop \n nop \n nop \n nop \n " ) ;
270+ NOP; NOP; NOP; NOP ;
290271 N64_PINB_LOW;
291- asm volatile (" nop\n nop\n nop\n nop\n nop\n "
292- " nop\n nop\n nop\n nop\n nop\n "
293- " nop\n nop\n nop\n nop\n " );
272+ NOP5; NOP5; NOP; NOP; NOP; NOP;
294273 N64_PINB_HIGH;
295274}
296275
@@ -316,14 +295,7 @@ void N64Controller::N64_PIND_get(char pincode)
316295 return ;
317296 }
318297 // wait approx 2us and poll the line
319- asm volatile (
320- " nop\n nop\n nop\n nop\n nop\n "
321- " nop\n nop\n nop\n nop\n nop\n "
322- " nop\n nop\n nop\n nop\n nop\n "
323- " nop\n nop\n nop\n nop\n nop\n "
324- " nop\n nop\n nop\n nop\n nop\n "
325- " nop\n nop\n nop\n nop\n nop\n "
326- );
298+ NOP30;
327299 *bitbin = N64_PIND_QUERY;
328300 ++bitbin;
329301 --bitcount;
@@ -355,14 +327,7 @@ void N64Controller::N64_PINB_get(char pincode)
355327 if (!--timeout)
356328 return ;
357329 }
358- asm volatile (
359- " nop\n nop\n nop\n nop\n nop\n "
360- " nop\n nop\n nop\n nop\n nop\n "
361- " nop\n nop\n nop\n nop\n nop\n "
362- " nop\n nop\n nop\n nop\n nop\n "
363- " nop\n nop\n nop\n nop\n nop\n "
364- " nop\n nop\n nop\n nop\n nop\n "
365- );
330+ NOP30;
366331 *bitbin = N64_PINB_QUERY;
367332 ++bitbin;
368333 --bitcount;
0 commit comments