1 //-----------------------------------------------------------------------------
2 // The main application code. This is the first thing called after start.c
4 // Jonathan Westhues, Mar 2006
5 // Edits by Gerhard de Koning Gans, Sep 2007 (##)
6 //-----------------------------------------------------------------------------
19 #define va_list __builtin_va_list
20 #define va_start __builtin_va_start
21 #define va_arg __builtin_va_arg
22 #define va_end __builtin_va_end
23 int kvsprintf(char const *fmt
, void *arg
, int radix
, va_list ap
);
26 #define abs(x) ( ((x)<0) ? -(x) : (x) )
28 //=============================================================================
29 // A buffer where we can queue things up to be sent through the FPGA, for
30 // any purpose (fake tag, as reader, whatever). We go MSB first, since that
31 // is the order in which they go out on the wire.
32 //=============================================================================
37 struct common_area common_area
__attribute__((section(".commonarea")));
39 void BufferClear(void)
41 memset(BigBuf
,0,sizeof(BigBuf
));
42 Dbprintf("Buffer cleared (%i bytes)",sizeof(BigBuf
));
45 void ToSendReset(void)
51 void ToSendStuffBit(int b
)
55 ToSend
[ToSendMax
] = 0;
60 ToSend
[ToSendMax
] |= (1 << (7 - ToSendBit
));
65 if(ToSendBit
>= sizeof(ToSend
)) {
67 DbpString("ToSendStuffBit overflowed!");
71 //=============================================================================
72 // Debug print functions, to go out over USB, to the usual PC-side client.
73 //=============================================================================
75 void DbpString(char *str
)
77 /* this holds up stuff unless we're connected to usb */
82 c
.cmd
= CMD_DEBUG_PRINT_STRING
;
83 c
.arg
[0] = strlen(str
);
84 if(c
.arg
[0] > sizeof(c
.d
.asBytes
)) {
85 c
.arg
[0] = sizeof(c
.d
.asBytes
);
87 memcpy(c
.d
.asBytes
, str
, c
.arg
[0]);
89 UsbSendPacket((uint8_t *)&c
, sizeof(c
));
90 // TODO fix USB so stupid things like this aren't req'd
95 void DbpIntegers(int x1
, int x2
, int x3
)
97 /* this holds up stuff unless we're connected to usb */
102 c
.cmd
= CMD_DEBUG_PRINT_INTEGERS
;
107 UsbSendPacket((uint8_t *)&c
, sizeof(c
));
113 void Dbprintf(const char *fmt
, ...) {
114 // should probably limit size here; oh well, let's just use a big buffer
115 char output_string
[128];
119 kvsprintf(fmt
, output_string
, 10, ap
);
122 DbpString(output_string
);
125 //-----------------------------------------------------------------------------
126 // Read an ADC channel and block till it completes, then return the result
127 // in ADC units (0 to 1023). Also a routine to average 32 samples and
129 //-----------------------------------------------------------------------------
130 static int ReadAdc(int ch
)
134 AT91C_BASE_ADC
->ADC_CR
= AT91C_ADC_SWRST
;
135 AT91C_BASE_ADC
->ADC_MR
=
136 ADC_MODE_PRESCALE(32) |
137 ADC_MODE_STARTUP_TIME(16) |
138 ADC_MODE_SAMPLE_HOLD_TIME(8);
139 AT91C_BASE_ADC
->ADC_CHER
= ADC_CHANNEL(ch
);
141 AT91C_BASE_ADC
->ADC_CR
= AT91C_ADC_START
;
142 while(!(AT91C_BASE_ADC
->ADC_SR
& ADC_END_OF_CONVERSION(ch
)))
144 d
= AT91C_BASE_ADC
->ADC_CDR
[ch
];
149 static int AvgAdc(int ch
)
154 for(i
= 0; i
< 32; i
++) {
158 return (a
+ 15) >> 5;
161 void MeasureAntennaTuning(void)
163 uint8_t *dest
= (uint8_t *)BigBuf
;
164 int i
, ptr
= 0, adcval
= 0, peak
= 0, peakv
= 0, peakf
= 0;;
165 int vLf125
= 0, vLf134
= 0, vHf
= 0; // in mV
169 DbpString("Measuring antenna characteristics, please wait.");
170 memset(BigBuf
,0,sizeof(BigBuf
));
173 * Sweeps the useful LF range of the proxmark from
174 * 46.8kHz (divisor=255) to 600kHz (divisor=19) and
175 * read the voltage in the antenna, the result left
176 * in the buffer is a graph which should clearly show
177 * the resonating frequency of your LF antenna
178 * ( hopefully around 95 if it is tuned to 125kHz!)
180 FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER
);
181 for (i
=255; i
>19; i
--) {
182 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
);
184 // Vref = 3.3V, and a 10000:240 voltage divider on the input
185 // can measure voltages up to 137500 mV
186 adcval
= ((137500 * AvgAdc(ADC_CHAN_LF
)) >> 10);
187 if (i
==95) vLf125
= adcval
; // voltage at 125Khz
188 if (i
==89) vLf134
= adcval
; // voltage at 134Khz
190 dest
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes
199 // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
200 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
);
202 // Vref = 3300mV, and an 10:1 voltage divider on the input
203 // can measure voltages up to 33000 mV
204 vHf
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10;
206 c
.cmd
= CMD_MEASURED_ANTENNA_TUNING
;
207 c
.arg
[0] = (vLf125
<< 0) | (vLf134
<< 16);
209 c
.arg
[2] = peakf
| (peakv
<< 16);
210 UsbSendPacket((uint8_t *)&c
, sizeof(c
));
213 void MeasureAntennaTuningHf(void)
215 int vHf
= 0; // in mV
217 DbpString("Measuring HF antenna, press button to exit");
220 // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
221 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
);
223 // Vref = 3300mV, and an 10:1 voltage divider on the input
224 // can measure voltages up to 33000 mV
225 vHf
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10;
227 Dbprintf("%d mV",vHf
);
228 if (BUTTON_PRESS()) break;
230 DbpString("cancelled");
234 void SimulateTagHfListen(void)
236 uint8_t *dest
= (uint8_t *)BigBuf
;
237 int n
= sizeof(BigBuf
);
242 // We're using this mode just so that I can test it out; the simulated
243 // tag mode would work just as well and be simpler.
244 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
| FPGA_HF_READER_RX_XCORR_848_KHZ
| FPGA_HF_READER_RX_XCORR_SNOOP
);
246 // We need to listen to the high-frequency, peak-detected path.
247 SetAdcMuxFor(GPIO_MUXSEL_HIPKD
);
253 if(AT91C_BASE_SSC
->SSC_SR
& (AT91C_SSC_TXRDY
)) {
254 AT91C_BASE_SSC
->SSC_THR
= 0xff;
256 if(AT91C_BASE_SSC
->SSC_SR
& (AT91C_SSC_RXRDY
)) {
257 uint8_t r
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
;
277 DbpString("simulate tag (now type bitsamples)");
280 void ReadMem(int addr
)
282 const uint8_t *data
= ((uint8_t *)addr
);
284 Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x",
285 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]);
288 /* osimage version information is linked in */
289 extern struct version_information version_information
;
290 /* bootrom version information is pointed to from _bootphase1_version_pointer */
291 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
;
292 void SendVersion(void)
294 char temp
[48]; /* Limited data payload in USB packets */
295 DbpString("Prox/RFID mark3 RFID instrument");
297 /* Try to find the bootrom version information. Expect to find a pointer at
298 * symbol _bootphase1_version_pointer, perform slight sanity checks on the
299 * pointer, then use it.
301 char *bootrom_version
= *(char**)&_bootphase1_version_pointer
;
302 if( bootrom_version
< &_flash_start
|| bootrom_version
>= &_flash_end
) {
303 DbpString("bootrom version information appears invalid");
305 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
);
309 FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
);
312 FpgaGatherVersion(temp
, sizeof(temp
));
317 // samy's sniff and repeat routine
320 DbpString("Stand-alone mode! No PC necessary.");
322 // 3 possible options? no just 2 for now
325 int high
[OPTS
], low
[OPTS
];
327 // Oooh pretty -- notify user we're in elite samy mode now
329 LED(LED_ORANGE
, 200);
331 LED(LED_ORANGE
, 200);
333 LED(LED_ORANGE
, 200);
335 LED(LED_ORANGE
, 200);
341 // Turn on selected LED
342 LED(selected
+ 1, 0);
349 // Was our button held down or pressed?
350 int button_pressed
= BUTTON_HELD(1000);
353 // Button was held for a second, begin recording
354 if (button_pressed
> 0)
357 LED(selected
+ 1, 0);
361 DbpString("Starting recording");
363 // wait for button to be released
364 while(BUTTON_PRESS())
367 /* need this delay to prevent catching some weird data */
370 CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0);
371 Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]);
374 LED(selected
+ 1, 0);
375 // Finished recording
377 // If we were previously playing, set playing off
378 // so next button push begins playing what we recorded
382 // Change where to record (or begin playing)
383 else if (button_pressed
)
385 // Next option if we were previously playing
387 selected
= (selected
+ 1) % OPTS
;
391 LED(selected
+ 1, 0);
393 // Begin transmitting
397 DbpString("Playing");
398 // wait for button to be released
399 while(BUTTON_PRESS())
401 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]);
402 CmdHIDsimTAG(high
[selected
], low
[selected
], 0);
403 DbpString("Done playing");
404 if (BUTTON_HELD(1000) > 0)
406 DbpString("Exiting");
411 /* We pressed a button so ignore it here with a delay */
414 // when done, we're done playing, move to next option
415 selected
= (selected
+ 1) % OPTS
;
418 LED(selected
+ 1, 0);
421 while(BUTTON_PRESS())
430 Listen and detect an external reader. Determine the best location
434 Inside the ListenReaderField() function, there is two mode.
435 By default, when you call the function, you will enter mode 1.
436 If you press the PM3 button one time, you will enter mode 2.
437 If you press the PM3 button a second time, you will exit the function.
439 DESCRIPTION OF MODE 1:
440 This mode just listens for an external reader field and lights up green
441 for HF and/or red for LF. This is the original mode of the detectreader
444 DESCRIPTION OF MODE 2:
445 This mode will visually represent, using the LEDs, the actual strength of the
446 current compared to the maximum current detected. Basically, once you know
447 what kind of external reader is present, it will help you spot the best location to place
448 your antenna. You will probably not get some good results if there is a LF and a HF reader
449 at the same place! :-)
453 static const char LIGHT_SCHEME
[] = {
454 0x0, /* ---- | No field detected */
455 0x1, /* X--- | 14% of maximum current detected */
456 0x2, /* -X-- | 29% of maximum current detected */
457 0x4, /* --X- | 43% of maximum current detected */
458 0x8, /* ---X | 57% of maximum current detected */
459 0xC, /* --XX | 71% of maximum current detected */
460 0xE, /* -XXX | 86% of maximum current detected */
461 0xF, /* XXXX | 100% of maximum current detected */
463 static const int LIGHT_LEN
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]);
465 void ListenReaderField(int limit
)
467 int lf_av
, lf_av_new
, lf_baseline
= 0, lf_count
= 0, lf_max
;
468 int hf_av
, hf_av_new
, hf_baseline
= 0, hf_count
= 0, hf_max
;
469 int mode
=1, display_val
, display_max
, i
;
476 lf_av
=lf_max
=ReadAdc(ADC_CHAN_LF
);
478 if(limit
!= HF_ONLY
) {
479 Dbprintf("LF 125/134 Baseline: %d", lf_av
);
483 hf_av
=hf_max
=ReadAdc(ADC_CHAN_HF
);
485 if (limit
!= LF_ONLY
) {
486 Dbprintf("HF 13.56 Baseline: %d", hf_av
);
491 if (BUTTON_PRESS()) {
496 DbpString("Signal Strength Mode");
500 DbpString("Stopped");
508 if (limit
!= HF_ONLY
) {
510 if (abs(lf_av
- lf_baseline
) > 10) LED_D_ON();
515 lf_av_new
= ReadAdc(ADC_CHAN_LF
);
516 // see if there's a significant change
517 if(abs(lf_av
- lf_av_new
) > 10) {
518 Dbprintf("LF 125/134 Field Change: %x %x %x", lf_av
, lf_av_new
, lf_count
);
526 if (limit
!= LF_ONLY
) {
528 if (abs(hf_av
- hf_baseline
) > 10) LED_B_ON();
533 hf_av_new
= ReadAdc(ADC_CHAN_HF
);
534 // see if there's a significant change
535 if(abs(hf_av
- hf_av_new
) > 10) {
536 Dbprintf("HF 13.56 Field Change: %x %x %x", hf_av
, hf_av_new
, hf_count
);
545 if (limit
== LF_ONLY
) {
547 display_max
= lf_max
;
548 } else if (limit
== HF_ONLY
) {
550 display_max
= hf_max
;
551 } else { /* Pick one at random */
552 if( (hf_max
- hf_baseline
) > (lf_max
- lf_baseline
) ) {
554 display_max
= hf_max
;
557 display_max
= lf_max
;
560 for (i
=0; i
<LIGHT_LEN
; i
++) {
561 if (display_val
>= ((display_max
/LIGHT_LEN
)*i
) && display_val
<= ((display_max
/LIGHT_LEN
)*(i
+1))) {
562 if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF();
563 if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF();
564 if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF();
565 if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF();
573 void UsbPacketReceived(uint8_t *packet
, int len
)
575 UsbCommand
*c
= (UsbCommand
*)packet
;
581 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
:
582 AcquireRawAdcSamples125k(c
->arg
[0]);
583 UsbSendPacket((uint8_t*)&ack
, sizeof(ack
));
588 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
:
589 ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
594 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
:
595 AcquireRawAdcSamplesIso15693();
604 case CMD_READER_ISO_15693
:
605 ReaderIso15693(c
->arg
[0]);
609 case CMD_READER_LEGIC_RF
:
610 LegicRfReader(c
->arg
[0], c
->arg
[1]);
614 case CMD_SIMTAG_ISO_15693
:
615 SimTagIso15693(c
->arg
[0]);
619 #ifdef WITH_ISO14443b
620 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443
:
621 AcquireRawAdcSamplesIso14443(c
->arg
[0]);
625 #ifdef WITH_ISO14443b
626 case CMD_READ_SRI512_TAG
:
627 ReadSRI512Iso14443(c
->arg
[0]);
629 case CMD_READ_SRIX4K_TAG
:
630 ReadSRIX4KIso14443(c
->arg
[0]);
634 #ifdef WITH_ISO14443a
635 case CMD_READER_ISO_14443a
:
636 ReaderIso14443a(c
->arg
[0]);
640 #ifdef WITH_ISO14443a
641 case CMD_READER_MIFARE
:
642 ReaderMifare(c
->arg
[0]);
646 #ifdef WITH_ISO14443b
647 case CMD_SNOOP_ISO_14443
:
652 #ifdef WITH_ISO14443a
653 case CMD_SNOOP_ISO_14443a
:
658 case CMD_SIMULATE_TAG_HF_LISTEN
:
659 SimulateTagHfListen();
662 #ifdef WITH_ISO14443b
663 case CMD_SIMULATE_TAG_ISO_14443
:
664 SimulateIso14443Tag();
668 #ifdef WITH_ISO14443a
669 case CMD_SIMULATE_TAG_ISO_14443a
:
670 SimulateIso14443aTag(c
->arg
[0], c
->arg
[1]); // ## Simulate iso14443a tag - pass tag type & UID
674 case CMD_MEASURE_ANTENNA_TUNING
:
675 MeasureAntennaTuning();
678 case CMD_MEASURE_ANTENNA_TUNING_HF
:
679 MeasureAntennaTuningHf();
682 case CMD_LISTEN_READER_FIELD
:
683 ListenReaderField(c
->arg
[0]);
687 case CMD_HID_DEMOD_FSK
:
688 CmdHIDdemodFSK(0, 0, 0, 1); // Demodulate HID tag
693 case CMD_HID_SIM_TAG
:
694 CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1); // Simulate HID tag by ID
698 case CMD_FPGA_MAJOR_MODE_OFF
: // ## FPGA Control
699 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
701 LED_D_OFF(); // LED D indicates field ON or OFF
705 case CMD_READ_TI_TYPE
:
711 case CMD_WRITE_TI_TYPE
:
712 WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]);
716 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: {
718 if(c
->cmd
== CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
) {
719 n
.cmd
= CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
;
721 n
.cmd
= CMD_DOWNLOADED_RAW_BITS_TI_TYPE
;
723 n
.arg
[0] = c
->arg
[0];
724 memcpy(n
.d
.asDwords
, BigBuf
+c
->arg
[0], 12*sizeof(uint32_t));
725 UsbSendPacket((uint8_t *)&n
, sizeof(n
));
729 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: {
730 uint8_t *b
= (uint8_t *)BigBuf
;
731 memcpy(b
+c
->arg
[0], c
->d
.asBytes
, 48);
732 //Dbprintf("copied 48 bytes to %i",b+c->arg[0]);
733 UsbSendPacket((uint8_t*)&ack
, sizeof(ack
));
738 case CMD_SIMULATE_TAG_125K
:
740 SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1);
749 case CMD_SET_LF_DIVISOR
:
750 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]);
753 case CMD_SET_ADC_MUX
:
755 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break;
756 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break;
757 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break;
758 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break;
767 case CMD_LF_SIMULATE_BIDIR
:
768 SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]);
780 case CMD_SETUP_WRITE
:
781 case CMD_FINISH_WRITE
:
782 case CMD_HARDWARE_RESET
:
783 USB_D_PLUS_PULLUP_OFF();
786 AT91C_BASE_RSTC
->RSTC_RCR
= RST_CONTROL_KEY
| AT91C_RSTC_PROCRST
;
788 // We're going to reset, and the bootrom will take control.
792 case CMD_START_FLASH
:
793 if(common_area
.flags
.bootrom_present
) {
794 common_area
.command
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
;
796 USB_D_PLUS_PULLUP_OFF();
797 AT91C_BASE_RSTC
->RSTC_RCR
= RST_CONTROL_KEY
| AT91C_RSTC_PROCRST
;
801 case CMD_DEVICE_INFO
: {
803 c
.cmd
= CMD_DEVICE_INFO
;
804 c
.arg
[0] = DEVICE_INFO_FLAG_OSIMAGE_PRESENT
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
;
805 if(common_area
.flags
.bootrom_present
) c
.arg
[0] |= DEVICE_INFO_FLAG_BOOTROM_PRESENT
;
806 UsbSendPacket((uint8_t*)&c
, sizeof(c
));
810 Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
);
815 void __attribute__((noreturn
)) AppMain(void)
819 if(common_area
.magic
!= COMMON_AREA_MAGIC
|| common_area
.version
!= 1) {
820 /* Initialize common area */
821 memset(&common_area
, 0, sizeof(common_area
));
822 common_area
.magic
= COMMON_AREA_MAGIC
;
823 common_area
.version
= 1;
825 common_area
.flags
.osimage_present
= 1;
834 // The FPGA gets its clock from us from PCK0 output, so set that up.
835 AT91C_BASE_PIOA
->PIO_BSR
= GPIO_PCK0
;
836 AT91C_BASE_PIOA
->PIO_PDR
= GPIO_PCK0
;
837 AT91C_BASE_PMC
->PMC_SCER
= AT91C_PMC_PCK0
;
838 // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz
839 AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK
|
840 AT91C_PMC_PRES_CLK_4
;
841 AT91C_BASE_PIOA
->PIO_OER
= GPIO_PCK0
;
844 AT91C_BASE_SPI
->SPI_CR
= AT91C_SPI_SWRST
;
846 AT91C_BASE_SSC
->SSC_CR
= AT91C_SSC_SWRST
;
848 // Load the FPGA image, which we have stored in our flash.
855 // test text on different colored backgrounds
856 LCDString(" The quick brown fox ", (char *)&FONT6x8
,1,1+8*0,WHITE
,BLACK
);
857 LCDString(" jumped over the ", (char *)&FONT6x8
,1,1+8*1,BLACK
,WHITE
);
858 LCDString(" lazy dog. ", (char *)&FONT6x8
,1,1+8*2,YELLOW
,RED
);
859 LCDString(" AaBbCcDdEeFfGgHhIiJj ", (char *)&FONT6x8
,1,1+8*3,RED
,GREEN
);
860 LCDString(" KkLlMmNnOoPpQqRrSsTt ", (char *)&FONT6x8
,1,1+8*4,MAGENTA
,BLUE
);
861 LCDString("UuVvWwXxYyZz0123456789", (char *)&FONT6x8
,1,1+8*5,BLUE
,YELLOW
);
862 LCDString("`-=[]_;',./~!@#$%^&*()", (char *)&FONT6x8
,1,1+8*6,BLACK
,CYAN
);
863 LCDString(" _+{}|:\\\"<>? ",(char *)&FONT6x8
,1,1+8*7,BLUE
,MAGENTA
);
866 LCDFill(0, 1+8* 8, 132, 8, BLACK
);
867 LCDFill(0, 1+8* 9, 132, 8, WHITE
);
868 LCDFill(0, 1+8*10, 132, 8, RED
);
869 LCDFill(0, 1+8*11, 132, 8, GREEN
);
870 LCDFill(0, 1+8*12, 132, 8, BLUE
);
871 LCDFill(0, 1+8*13, 132, 8, YELLOW
);
872 LCDFill(0, 1+8*14, 132, 8, CYAN
);
873 LCDFill(0, 1+8*15, 132, 8, MAGENTA
);
882 if (BUTTON_HELD(1000) > 0)