Skip to content

Commit 80915bd

Browse files
committed
define macros for nop blocks
1 parent b603217 commit 80915bd

File tree

1 file changed

+24
-59
lines changed

1 file changed

+24
-59
lines changed

N64Controller/N64Controller.cpp

Lines changed: 24 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@
33
#include <Arduino.h>
44
#include "pins_arduino.h"
55

6+
#define NOP asm volatile ("nop")
7+
#define NOP5 asm volatile ("nop\nnop\nnop\nnop\nnop\n")
8+
#define NOP30 asm volatile ("nop\nnop\nnop\nnop\nnop\n" \
9+
"nop\nnop\nnop\nnop\nnop\n" \
10+
"nop\nnop\nnop\nnop\nnop\n" \
11+
"nop\nnop\nnop\nnop\nnop\n" \
12+
"nop\nnop\nnop\nnop\nnop\n" \
13+
"nop\nnop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\n"
161-
"nop\nnop\nnop\nnop\nnop\n"
162-
"nop\nnop\nnop\nnop\nnop\n"
163-
"nop\nnop\nnop\nnop\nnop\n"
164-
"nop\nnop\nnop\nnop\nnop\n"
165-
"nop\nnop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\n"
174-
"nop\nnop\nnop\nnop\nnop\n"
175-
"nop\nnop\nnop\nnop\nnop\n"
176-
"nop\nnop\nnop\nnop\nnop\n"
177-
"nop\nnop\nnop\nnop\nnop\n"
178-
"nop\nnop\nnop\nnop\nnop\n"
179-
"nop\nnop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\n"
199-
"nop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\n"
226-
"nop\nnop\nnop\nnop\nnop\n"
227-
"nop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\n");
242+
NOP5;
248243
asm volatile (";Setting line to high");
249244
N64_PINB_HIGH;
250-
asm volatile ("nop\nnop\nnop\nnop\nnop\n"
251-
"nop\nnop\nnop\nnop\nnop\n"
252-
"nop\nnop\nnop\nnop\nnop\n"
253-
"nop\nnop\nnop\nnop\nnop\n"
254-
"nop\nnop\nnop\nnop\nnop\n"
255-
"nop\nnop\nnop\nnop\nnop\n"
256-
);
245+
NOP30;
257246
} else {
258247
asm volatile (";Bit is a 0");
259-
asm volatile ("nop\nnop\nnop\nnop\nnop\n"
260-
"nop\nnop\nnop\nnop\nnop\n"
261-
"nop\nnop\nnop\nnop\nnop\n"
262-
"nop\nnop\nnop\nnop\nnop\n"
263-
"nop\nnop\nnop\nnop\nnop\n"
264-
"nop\nnop\nnop\nnop\nnop\n"
265-
"nop\nnop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\n"
276-
"nop\nnop\nnop\nnop\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\nnop\nnop\nnop\n");
270+
NOP; NOP; NOP; NOP;
290271
N64_PINB_LOW;
291-
asm volatile ("nop\nnop\nnop\nnop\nnop\n"
292-
"nop\nnop\nnop\nnop\nnop\n"
293-
"nop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\n"
321-
"nop\nnop\nnop\nnop\nnop\n"
322-
"nop\nnop\nnop\nnop\nnop\n"
323-
"nop\nnop\nnop\nnop\nnop\n"
324-
"nop\nnop\nnop\nnop\nnop\n"
325-
"nop\nnop\nnop\nnop\nnop\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\nnop\nnop\nnop\nnop\n"
360-
"nop\nnop\nnop\nnop\nnop\n"
361-
"nop\nnop\nnop\nnop\nnop\n"
362-
"nop\nnop\nnop\nnop\nnop\n"
363-
"nop\nnop\nnop\nnop\nnop\n"
364-
"nop\nnop\nnop\nnop\nnop\n"
365-
);
330+
NOP30;
366331
*bitbin = N64_PINB_QUERY;
367332
++bitbin;
368333
--bitcount;

0 commit comments

Comments
 (0)