+void
+ao_radio_rdf(void)
+{
+ ao_radio_rdf_start();
+
+ ao_dma_set_transfer(ao_radio_dma,
+ CODE_TO_XDATA(&ao_radio_rdf_value),
+ &RFDXADDR,
+ AO_RADIO_RDF_LEN,
+ DMA_CFG0_WORDSIZE_8 |
+ DMA_CFG0_TMODE_SINGLE |
+ DMA_CFG0_TRIGGER_RADIO,
+ DMA_CFG1_SRCINC_0 |
+ DMA_CFG1_DESTINC_0 |
+ DMA_CFG1_PRIORITY_HIGH);
+ ao_radio_rdf_run();
+}
+
+#define PA 0x00
+#define BE 0x55
+
+#define CONT_PAUSE_8 PA, PA, PA, PA, PA, PA, PA, PA
+#define CONT_PAUSE_16 CONT_PAUSE_8, CONT_PAUSE_8
+#define CONT_PAUSE_24 CONT_PAUSE_16, CONT_PAUSE_8
+
+#define CONT_BEEP_8 BE, BE, BE, BE, BE, BE, BE, BE
+
+#if AO_RADIO_CONT_PAUSE_LEN == 24
+#define CONT_PAUSE CONT_PAUSE_24
+#endif
+
+#if AO_RADIO_CONT_TONE_LEN == 8
+#define CONT_BEEP CONT_BEEP_8
+#define CONT_PAUSE_SHORT CONT_PAUSE_8
+#endif
+
+#define CONT_ADDR(c) CODE_TO_XDATA(&ao_radio_cont[(3-(c)) * (AO_RADIO_CONT_PAUSE_LEN + AO_RADIO_CONT_TONE_LEN)])
+
+__code uint8_t ao_radio_cont[] = {
+ CONT_PAUSE, CONT_BEEP,
+ CONT_PAUSE, CONT_BEEP,
+ CONT_PAUSE, CONT_BEEP,
+ CONT_PAUSE, CONT_PAUSE_SHORT,
+ CONT_PAUSE, CONT_PAUSE_SHORT,
+ CONT_PAUSE,
+};
+
+void
+ao_radio_continuity(uint8_t c)
+{
+ ao_radio_rdf_start();
+ ao_dma_set_transfer(ao_radio_dma,
+ CONT_ADDR(c),
+ &RFDXADDR,
+ AO_RADIO_CONT_TOTAL_LEN,
+ DMA_CFG0_WORDSIZE_8 |
+ DMA_CFG0_TMODE_SINGLE |
+ DMA_CFG0_TRIGGER_RADIO,
+ DMA_CFG1_SRCINC_1 |
+ DMA_CFG1_DESTINC_0 |
+ DMA_CFG1_PRIORITY_HIGH);
+ ao_radio_rdf_run();
+}
+