Skip to content

Commit 19042f2

Browse files
committed
AT32F435: Reduce sample clock to 72MHz, same as 105/415 build.
It provides plkenty high enough resolution, while reducing risk of unexpected tick overflows.
1 parent fdf1c93 commit 19042f2

File tree

12 files changed

+64
-57
lines changed

12 files changed

+64
-57
lines changed

inc/floppy.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99
* See the file COPYING for more details, or visit <http://unlicense.org>.
1010
*/
1111

12+
#define SAMPLECLK_MHZ 72
13+
#define sampleclk_ns(x) (((x) * SAMPLECLK_MHZ) / 1000)
14+
#define sampleclk_us(x) ((x) * SAMPLECLK_MHZ)
15+
#define sampleclk_ms(x) ((x) * SAMPLECLK_MHZ * 1000)
16+
#define sampleclk_stk(x) ((x) * (SAMPLECLK_MHZ / STK_MHZ))
17+
#define stk_sampleclk(x) ((x) / (SAMPLECLK_MHZ / STK_MHZ))
18+
1219
#ifdef QUICKDISK
1320
#define is_quickdisk TRUE
1421
#else
@@ -179,7 +186,7 @@ struct image {
179186

180187
/* Info about current track. */
181188
uint16_t cur_track;
182-
uint16_t write_bc_ticks; /* Nr SYSCLK ticks per bitcell in write stream */
189+
uint16_t write_bc_ticks; /* SAMPLECLK ticks per bitcell in write stream */
183190
uint32_t ticks_per_cell; /* Nr 'ticks' per bitcell in read stream. */
184191
uint32_t tracklen_bc, cur_bc; /* Track length and cursor, in bitcells */
185192
uint32_t tracklen_ticks; /* Timing of previous revolution, in 'ticks' */
@@ -232,7 +239,7 @@ void image_open(struct image *im, struct slot *slot, DWORD *cltbl);
232239
void image_extend(struct image *im);
233240

234241
/* Seek to given track and start reading track data at specified rotational
235-
* position (specified as number of SYSCLK ticks past the index mark).
242+
* position (specified as number of SAMPLECLK ticks past the index mark).
236243
*
237244
* If start_pos is NULL then the caller is in write mode and thus is not
238245
* interested in fetching data from a particular rotational position.
@@ -252,7 +259,7 @@ uint16_t bc_rdata_flux(struct image *im, uint16_t *tbuf, uint16_t nr);
252259
* was completed for the write at the tail of the pipeline. */
253260
bool_t image_write_track(struct image *im);
254261

255-
/* Rotational position of last-generated flux (SYSCLK ticks past index). */
262+
/* Rotational position of last-generated flux (SAMPLECLK ticks past index). */
256263
uint32_t image_ticks_since_index(struct image *im);
257264

258265
/* MFM conversion. */

src/floppy.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ void floppy_insert(unsigned int unit, struct slot *slot)
327327
floppy_mount(slot);
328328
im = image;
329329

330-
if (im->write_bc_ticks < sysclk_ns(1500))
330+
if (im->write_bc_ticks < sampleclk_ns(1500))
331331
drive_change_output(drv, outp_hden, TRUE);
332332

333333
timer_dma_init();
@@ -417,8 +417,7 @@ static void floppy_sync_flux(void)
417417

418418
/* If we crossed the index mark while filling the DMA buffer then we
419419
* need to set up the index pulse (usually done by IRQ_rdata_dma). */
420-
if (image_ticks_since_index(drv->image)
421-
< (sync_pos*(SYSCLK_MHZ/STK_MHZ))) {
420+
if (image_ticks_since_index(drv->image) < sampleclk_stk(sync_pos)) {
422421

423422
/* Sum all flux timings in the DMA buffer. */
424423
const uint16_t buf_mask = ARRAY_SIZE(dma_rd->buf) - 1;
@@ -430,7 +429,7 @@ static void floppy_sync_flux(void)
430429
ticks -= image_ticks_since_index(drv->image);
431430

432431
/* Calculate deadline for index timer. */
433-
ticks /= SYSCLK_MHZ/TIME_MHZ;
432+
ticks /= SAMPLECLK_MHZ/TIME_MHZ;
434433
timer_set(&index.timer, time_now() + ticks);
435434
}
436435

@@ -472,7 +471,7 @@ static bool_t dma_rd_handle(struct drive *drv)
472471
read_start_pos %= im->stk_per_rev;
473472
/* Seek to the new track. */
474473
track = drive_calc_track(drv);
475-
read_start_pos *= SYSCLK_MHZ/STK_MHZ;
474+
read_start_pos *= SAMPLECLK_MHZ/STK_MHZ;
476475
if (in_da_mode(im, track>>1) && (drv->outp & m(outp_wrprot))
477476
&& !volume_readonly()) {
478477
/* Remove write-protect when driven into D-A mode. */
@@ -481,7 +480,7 @@ static bool_t dma_rd_handle(struct drive *drv)
481480
if (image_setup_track(im, track, &read_start_pos))
482481
return TRUE;
483482
prefetch_start_time = time_now();
484-
read_start_pos /= SYSCLK_MHZ/STK_MHZ;
483+
read_start_pos /= SAMPLECLK_MHZ/STK_MHZ;
485484
sync_pos = read_start_pos;
486485
if (!drv->index_suppressed) {
487486
/* Set the deadline to match existing index timing. */

src/floppy_generic.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,17 +251,17 @@ static void timer_dma_init(void)
251251
IRQx_enable(dma_wdata_irq);
252252

253253
/* RDATA Timer setup:
254-
* The counter is incremented at full SYSCLK rate.
254+
* The counter is incremented at SAMPLECLK rate.
255255
*
256256
* Ch.2 (RDATA) is in PWM mode 1. It outputs O_TRUE for 400ns and then
257257
* O_FALSE until the counter reloads. By changing the ARR via DMA we alter
258258
* the time between (fixed-width) O_TRUE pulses, mimicking floppy drive
259259
* timings. */
260-
tim_rdata->psc = 0;
260+
tim_rdata->psc = (SYSCLK_MHZ/SAMPLECLK_MHZ) - 1;
261261
tim_rdata->ccmr1 = (TIM_CCMR1_CC2S(TIM_CCS_OUTPUT) |
262262
TIM_CCMR1_OC2M(TIM_OCM_PWM1));
263263
tim_rdata->ccer = TIM_CCER_CC2E | ((O_TRUE==0) ? TIM_CCER_CC2P : 0);
264-
tim_rdata->ccr2 = sysclk_ns(400);
264+
tim_rdata->ccr2 = sampleclk_ns(400);
265265
tim_rdata->dier = TIM_DIER_UDE;
266266
tim_rdata->cr2 = 0;
267267

@@ -280,13 +280,13 @@ static void timer_dma_init(void)
280280
DMA_CCR_EN);
281281

282282
/* WDATA Timer setup:
283-
* The counter runs from 0x0000-0xFFFF inclusive at full SYSCLK rate.
283+
* The counter runs from 0x0000-0xFFFF inclusive at SAMPLECLK rate.
284284
*
285285
* Ch.1 (WDATA) is in Input Capture mode, sampling on every clock and with
286286
* no input prescaling or filtering. Samples are captured on the falling
287287
* edge of the input (CCxP=1). DMA is used to copy the sample into a ring
288288
* buffer for batch processing in the DMA-completion ISR. */
289-
tim_wdata->psc = 0;
289+
tim_wdata->psc = (SYSCLK_MHZ/SAMPLECLK_MHZ) - 1;
290290
tim_wdata->arr = 0xffff;
291291
tim_wdata->ccmr1 = TIM_CCMR1_CC1S(TIM_CCS_INPUT_TI1);
292292
tim_wdata->dier = TIM_DIER_CC1DE;
@@ -407,10 +407,10 @@ static void wdata_start(void)
407407
tim_wdata->ccer = TIM_CCER_CC1E | TIM_CCER_CC1P;
408408
tim_wdata->cr1 = TIM_CR1_CEN;
409409

410-
/* Find rotational start position of the write, in SYSCLK ticks. */
410+
/* Find rotational start position of the write, in SAMPLECLK ticks. */
411411
start_pos = max_t(int32_t, 0, time_diff(index.prev_time, time_now()));
412412
start_pos %= drive.image->stk_per_rev;
413-
start_pos *= SYSCLK_MHZ / STK_MHZ;
413+
start_pos *= SAMPLECLK_MHZ / STK_MHZ;
414414
write = get_write(image, image->wr_prod);
415415
write->start = start_pos;
416416
write->track = drive_calc_track(&drive);
@@ -635,7 +635,7 @@ static void IRQ_rdata_dma(void)
635635
/* Subtract current flux offset beyond the index. */
636636
ticks -= image_ticks_since_index(drv->image);
637637
/* Calculate deadline for index timer. */
638-
ticks /= SYSCLK_MHZ/TIME_MHZ;
638+
ticks /= SAMPLECLK_MHZ/TIME_MHZ;
639639
timer_set(&index.timer, now + ticks);
640640
}
641641

src/image/adf.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ static bool_t adf_open(struct image *im)
3939
im->nr_sides = 2;
4040
im->adf.nr_secs = 11;
4141
im->tracklen_bc = DD_TRACKLEN_BC;
42-
im->ticks_per_cell = (sysclk_stk(im->stk_per_rev) * 16u) / im->tracklen_bc;
42+
im->ticks_per_cell = ((sampleclk_stk(im->stk_per_rev) * 16u)
43+
/ im->tracklen_bc);
4344

4445
im->nr_cyls = f_size(&im->fp) / (2 * 11 * 512);
4546

@@ -66,7 +67,7 @@ static void adf_setup_track(
6667
{
6768
struct image_buf *rd = &im->bufs.read_data;
6869
struct image_buf *bc = &im->bufs.read_bc;
69-
uint32_t decode_off, sector, sys_ticks = start_pos ? *start_pos : 0;
70+
uint32_t decode_off, sector, start_ticks = start_pos ? *start_pos : 0;
7071

7172
if ((im->cur_track ^ track) & ~1) {
7273
/* New cylinder: Refresh the sector maps (ordered by sector #). */
@@ -78,7 +79,7 @@ static void adf_setup_track(
7879
im->adf.trk_off = track * im->adf.nr_secs * 512;
7980
im->cur_track = track;
8081

81-
im->cur_bc = (sys_ticks * 16) / im->ticks_per_cell;
82+
im->cur_bc = (start_ticks * 16) / im->ticks_per_cell;
8283
if (im->cur_bc >= im->tracklen_bc)
8384
im->cur_bc = 0;
8485
im->cur_ticks = im->cur_bc * im->ticks_per_cell;

src/image/da.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,12 @@ static void da_seek_track(struct image *im, uint16_t track)
7878
case DA_SD_FM_CYL:
7979
dass->nr_sec = 4;
8080
im->sync = SYNC_fm;
81-
im->write_bc_ticks = sysclk_us(4);
81+
im->write_bc_ticks = sampleclk_us(4);
8282
break;
8383
default:
8484
dass->nr_sec = 8;
8585
im->sync = SYNC_mfm;
86-
im->write_bc_ticks = sysclk_us(2);
86+
im->write_bc_ticks = sampleclk_us(2);
8787
break;
8888
}
8989

@@ -95,7 +95,7 @@ static void da_setup_track(
9595
{
9696
struct image_buf *rd = &im->bufs.read_data;
9797
struct image_buf *bc = &im->bufs.read_bc;
98-
uint32_t decode_off, sys_ticks = start_pos ? *start_pos : 0;
98+
uint32_t decode_off, start_ticks = start_pos ? *start_pos : 0;
9999
unsigned int nsec;
100100

101101
da_seek_track(im, track);
@@ -120,11 +120,11 @@ static void da_setup_track(
120120
im->tracklen_bc += im->da.idx_sz;
121121
im->tracklen_bc *= 16;
122122

123-
im->stk_per_rev = stk_sysclk(im->tracklen_bc * im->write_bc_ticks);
123+
im->stk_per_rev = stk_sampleclk(im->tracklen_bc * im->write_bc_ticks);
124124

125125
im->da.trk_sec = 0;
126126

127-
im->cur_bc = (sys_ticks * 16) / im->ticks_per_cell;
127+
im->cur_bc = (start_ticks * 16) / im->ticks_per_cell;
128128
im->cur_bc &= ~15;
129129
if (im->cur_bc >= im->tracklen_bc)
130130
im->cur_bc = 0;
@@ -157,7 +157,7 @@ static void da_setup_track(
157157
if (start_pos) {
158158
image_read_track(im);
159159
bc->cons = decode_off * 16;
160-
*start_pos = sys_ticks;
160+
*start_pos = start_ticks;
161161
}
162162
}
163163

src/image/dsk.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ static void dsk_seek_track(
183183
im->dsk.gap4 = (im->tracklen_bc - tracklen) / 16;
184184

185185
/* Calculate ticks per revolution */
186-
im->stk_per_rev = stk_sysclk(im->tracklen_bc * im->write_bc_ticks);
186+
im->stk_per_rev = stk_sampleclk(im->tracklen_bc * im->write_bc_ticks);
187187
}
188188

189189
static uint32_t calc_start_pos(struct image *im)
@@ -251,7 +251,7 @@ static void dsk_setup_track(
251251
{
252252
struct image_buf *rd = &im->bufs.read_data;
253253
struct image_buf *bc = &im->bufs.read_bc;
254-
uint32_t decode_off, sys_ticks = start_pos ? *start_pos : 0;
254+
uint32_t decode_off, start_ticks = start_pos ? *start_pos : 0;
255255
uint8_t cyl = track/2, side = track & (im->nr_sides - 1);
256256

257257
track = cyl*2 + side;
@@ -260,7 +260,7 @@ static void dsk_setup_track(
260260

261261
im->dsk.write_sector = -1;
262262

263-
im->cur_bc = (sys_ticks * 16) / im->ticks_per_cell;
263+
im->cur_bc = (start_ticks * 16) / im->ticks_per_cell;
264264
im->cur_bc &= ~15;
265265
if (im->cur_bc >= im->tracklen_bc)
266266
im->cur_bc = 0;
@@ -275,7 +275,7 @@ static void dsk_setup_track(
275275
if (start_pos) {
276276
image_read_track(im);
277277
bc->cons = decode_off * 16;
278-
*start_pos = sys_ticks;
278+
*start_pos = start_ticks;
279279
}
280280
}
281281

src/image/dummy.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ static void dummy_setup_track(
2121
{
2222
im->cur_track = track;
2323
im->cur_ticks = (start_pos ? *start_pos : 0) * 16;
24-
im->tracklen_ticks = sysclk_stk(im->stk_per_rev) * 16;
24+
im->tracklen_ticks = sampleclk_stk(im->stk_per_rev) * 16;
2525
im->ticks_since_flux = 0;
2626
}
2727

src/image/hfe.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ static bool_t hfe_open(struct image *im)
102102
im->nr_cyls = dhdr.nr_tracks;
103103
im->step = im->hfe.double_step ? 2 : 1;
104104
im->nr_sides = dhdr.nr_sides;
105-
im->write_bc_ticks = sysclk_us(500) / bitrate;
105+
im->write_bc_ticks = sampleclk_us(500) / bitrate;
106106
im->ticks_per_cell = im->write_bc_ticks * 16;
107107
im->sync = SYNC_none;
108108

@@ -128,7 +128,7 @@ static void hfe_seek_track(struct image *im, uint16_t track)
128128
im->hfe.trk_off = le16toh(thdr.offset);
129129
im->hfe.trk_len = le16toh(thdr.len) / 2;
130130
im->tracklen_bc = im->hfe.trk_len * 8;
131-
im->stk_per_rev = stk_sysclk(im->tracklen_bc * im->write_bc_ticks);
131+
im->stk_per_rev = stk_sampleclk(im->tracklen_bc * im->write_bc_ticks);
132132

133133
im->cur_track = track;
134134
}
@@ -138,36 +138,36 @@ static void hfe_setup_track(
138138
{
139139
struct image_buf *rd = &im->bufs.read_data;
140140
struct image_buf *bc = &im->bufs.read_bc;
141-
uint32_t sys_ticks;
141+
uint32_t start_ticks;
142142
uint8_t cyl = track >> (im->hfe.double_step ? 2 : 1);
143143
uint8_t side = track & (im->nr_sides - 1);
144144

145145
track = cyl*2 + side;
146146
if (track != im->cur_track)
147147
hfe_seek_track(im, track);
148148

149-
sys_ticks = start_pos ? *start_pos : get_write(im, im->wr_cons)->start;
150-
im->cur_bc = (sys_ticks * 16) / im->ticks_per_cell;
149+
start_ticks = start_pos ? *start_pos : get_write(im, im->wr_cons)->start;
150+
im->cur_bc = (start_ticks * 16) / im->ticks_per_cell;
151151
if (im->cur_bc >= im->tracklen_bc)
152152
im->cur_bc = 0;
153153
im->cur_ticks = im->cur_bc * im->ticks_per_cell;
154154
im->ticks_since_flux = 0;
155155

156-
sys_ticks = im->cur_ticks / 16;
156+
start_ticks = im->cur_ticks / 16;
157157

158158
rd->prod = rd->cons = 0;
159159
bc->prod = bc->cons = 0;
160160

161161
/* Aggressively batch our reads at HD data rate, as that can be faster
162162
* than some USB drives will serve up a single block.*/
163-
im->hfe.batch_secs = (im->write_bc_ticks > sysclk_ns(1500)) ? 2 : 8;
163+
im->hfe.batch_secs = (im->write_bc_ticks > sampleclk_ns(1500)) ? 2 : 8;
164164

165165
if (start_pos) {
166166
/* Read mode. */
167167
im->hfe.trk_pos = (im->cur_bc/8) & ~255;
168168
image_read_track(im);
169169
bc->cons = im->cur_bc & 2047;
170-
*start_pos = sys_ticks;
170+
*start_pos = start_ticks;
171171
} else {
172172
/* Write mode. */
173173
im->hfe.trk_pos = im->cur_bc / 8;
@@ -260,7 +260,7 @@ static uint16_t hfe_rdata_flux(struct image *im, uint16_t *tbuf, uint16_t nr)
260260
case OP_bitrate:
261261
x = _rbit32(bc_b[(bc_c/8+1) & bc_mask]) >> 24;
262262
im->ticks_per_cell = ticks_per_cell =
263-
(sysclk_us(2) * 16 * x) / 72;
263+
(sampleclk_us(2) * 16 * x) / 72;
264264
bc_c += 2*8;
265265
im->cur_bc += 2*8;
266266
y = 8;

src/image/image.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ static bool_t try_handler(struct image *im, struct slot *slot,
116116

117117
/* Sensible defaults. */
118118
im->sync = SYNC_mfm;
119-
im->write_bc_ticks = sysclk_us(2);
119+
im->write_bc_ticks = sampleclk_us(2);
120120
im->stk_per_rev = stk_ms(200);
121121

122122
im->disk_handler = im->track_handler = handler;

src/image/img.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,7 +1808,7 @@ static void raw_setup_track(
18081808
{
18091809
struct image_buf *rd = &im->bufs.read_data;
18101810
struct image_buf *bc = &im->bufs.read_bc;
1811-
uint32_t decode_off, sys_ticks = start_pos ? *start_pos : 0;
1811+
uint32_t decode_off, start_ticks = start_pos ? *start_pos : 0;
18121812
uint8_t cyl = track/(2*im->step), side = track & (im->nr_sides - 1);
18131813

18141814
track = cyl*2 + side;
@@ -1817,7 +1817,7 @@ static void raw_setup_track(
18171817

18181818
im->img.write_sector = -1;
18191819

1820-
im->cur_bc = (sys_ticks * 16) / im->ticks_per_cell;
1820+
im->cur_bc = (start_ticks * 16) / im->ticks_per_cell;
18211821
im->cur_bc &= ~15;
18221822
if (im->cur_bc >= im->tracklen_bc)
18231823
im->cur_bc = 0;
@@ -1832,7 +1832,7 @@ static void raw_setup_track(
18321832
if (start_pos) {
18331833
image_read_track(im);
18341834
bc->cons = decode_off * 16;
1835-
*start_pos = sys_ticks;
1835+
*start_pos = start_ticks;
18361836
}
18371837
}
18381838

@@ -2344,11 +2344,11 @@ static void mfm_prep_track(struct image *im)
23442344
im->tracklen_bc = max_t(uint32_t, im->tracklen_bc, tracklen);
23452345
im->tracklen_bc = (im->tracklen_bc + 31) & ~31;
23462346

2347-
im->ticks_per_cell = ((sysclk_stk(im->stk_per_rev) * 16u)
2347+
im->ticks_per_cell = ((sampleclk_stk(im->stk_per_rev) * 16u)
23482348
/ im->tracklen_bc);
23492349
im->img.gap_4 = (im->tracklen_bc - tracklen) / 16;
23502350

2351-
im->write_bc_ticks = sysclk_us(500) / trk->data_rate;
2351+
im->write_bc_ticks = sampleclk_us(500) / trk->data_rate;
23522352

23532353
im->sync = SYNC_mfm;
23542354

@@ -2562,11 +2562,11 @@ static void fm_prep_track(struct image *im)
25622562
im->tracklen_bc = max_t(uint32_t, im->tracklen_bc, tracklen);
25632563
im->tracklen_bc = (im->tracklen_bc + 31) & ~31;
25642564

2565-
im->ticks_per_cell = ((sysclk_stk(im->stk_per_rev) * 16u)
2565+
im->ticks_per_cell = ((sampleclk_stk(im->stk_per_rev) * 16u)
25662566
/ im->tracklen_bc);
25672567
im->img.gap_4 = (im->tracklen_bc - tracklen) / 16;
25682568

2569-
im->write_bc_ticks = sysclk_us(500) / trk->data_rate;
2569+
im->write_bc_ticks = sampleclk_us(500) / trk->data_rate;
25702570

25712571
im->sync = SYNC_fm;
25722572

0 commit comments

Comments
 (0)