Skip to content

Commit b3f9a61

Browse files
committed
apple2: Capture all edges of WDATA
1 parent 2d68e12 commit b3f9a61

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed

inc/floppy.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
#define is_quickdisk FALSE
2323
#endif
2424

25+
#if defined(APPLE2)
26+
#define WDATA_TOGGLE TRUE
27+
#else
28+
#define WDATA_TOGGLE FALSE
29+
#endif
30+
2531
#define FINTF_SHUGART 0
2632
#define FINTF_IBMPC 1
2733
#define FINTF_IBMPC_HDOUT 2

src/floppy_generic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ static void timer_dma_init(void)
294294
tim_wdata->psc = (SYSCLK_MHZ/SAMPLECLK_MHZ) - 1;
295295
tim_wdata->arr = 0xffff;
296296
tim_wdata->ccmr1 = TIM_CCMR1_CC1S(TIM_CCS_INPUT_TI1);
297-
tim_wdata->dier = TIM_DIER_CC1DE;
297+
tim_wdata->dier = TIM_DIER_CC1DE | (WDATA_TOGGLE ? TIM_DIER_CC1IE : 0);
298298
tim_wdata->cr2 = 0;
299299

300300
/* DMA setup: From the WDATA Timer's CCRx into a circular buffer. */

src/gotek/floppy.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,28 @@ DEFINE_IRQ(dma_wdata_irq, "IRQ_wdata_dma");
5353
#define dma_rdata_irq DMA1_CH3_IRQ
5454
DEFINE_IRQ(dma_rdata_irq, "IRQ_rdata_dma");
5555

56-
/* EXTI IRQs. */
57-
void IRQ_6(void) __attribute__((alias("IRQ_SELA_changed"))); /* EXTI0 */
58-
void IRQ_7(void) __attribute__((alias("IRQ_WGATE_rotary"))); /* EXTI1 */
59-
void IRQ_10(void) __attribute__((alias("IRQ_SIDE_changed"))); /* EXTI4 */
60-
void IRQ_23(void) __attribute__((alias("IRQ_WGATE_rotary"))); /* EXTI9_5 */
56+
/* Head step handling. */
6157
#if defined(APPLE2)
6258
static struct timer step_timer;
6359
static void POLL_step(void *unused);
6460
#else
6561
void IRQ_28(void) __attribute__((alias("IRQ_STEP_changed"))); /* TMR2 */
6662
#endif
63+
64+
/* EXTI IRQs. */
65+
void IRQ_6(void) __attribute__((alias("IRQ_SELA_changed"))); /* EXTI0 */
66+
void IRQ_7(void) __attribute__((alias("IRQ_WGATE_rotary"))); /* EXTI1 */
67+
void IRQ_10(void) __attribute__((alias("IRQ_SIDE_changed"))); /* EXTI4 */
68+
void IRQ_23(void) __attribute__((alias("IRQ_WGATE_rotary"))); /* EXTI9_5 */
6769
void IRQ_40(void) __attribute__((alias("IRQ_MOTOR_CHGRST_rotary"))); /* EXTI15_10 */
70+
#if WDATA_TOGGLE
71+
void IRQ_27(void) __attribute__((alias("IRQ_wdata_capture"))); /* TMR1_CC */
72+
#endif
6873
#define MOTOR_CHGRST_IRQ 40
6974
static const struct exti_irq exti_irqs[] = {
75+
#if WDATA_TOGGLE
76+
/* WDATA */ { 27, FLOPPY_IRQ_WGATE_PRI, 0 },
77+
#endif
7078
/* SELA */ { 6, FLOPPY_IRQ_SEL_PRI, 0 },
7179
#if !defined(APPLE2)
7280
/* STEP */ { 28, FLOPPY_IRQ_STEP_PRI, m(2) /* dummy */ },
@@ -532,6 +540,17 @@ static void IRQ_CHGRST(struct drive *drv)
532540
}
533541
}
534542

543+
#if WDATA_TOGGLE
544+
static void IRQ_wdata_capture(void)
545+
{
546+
/* Clear WDATA-captured flag. */
547+
(void)tim_wdata->ccr1;
548+
549+
/* Toggle polarity to capture the next edge. */
550+
tim_wdata->ccer ^= TIM_CCER_CC1P;
551+
}
552+
#endif
553+
535554
static void IRQ_MOTOR_CHGRST_rotary(void)
536555
{
537556
struct drive *drv = &drive;

0 commit comments

Comments
 (0)