Add the ability to erase tracks. The writer now erases tracks for which no data

is available.
This commit is contained in:
David Given
2019-01-10 23:51:47 +01:00
parent 564fb63685
commit 80cb1e7a81
5 changed files with 69 additions and 15 deletions

View File

@@ -511,6 +511,27 @@ static void cmd_write(struct write_frame* f)
send_reply((struct any_frame*) &r);
}
static void cmd_erase(struct erase_frame* f)
{
SIDE_REG_Write(f->side);
seek_to(current_track);
/* Disk is now spinning. */
print("start erasing\r");
index_irq = false;
while (!index_irq)
;
ERASE_REG_Write(1);
index_irq = false;
while (!index_irq)
;
ERASE_REG_Write(0);
print("stop erasing\r");
DECLARE_REPLY_FRAME(struct any_frame, F_FRAME_ERASE_REPLY);
send_reply((struct any_frame*) &r);
}
static void handle_command(void)
{
static uint8_t input_buffer[FRAME_SIZE];
@@ -543,6 +564,10 @@ static void handle_command(void)
cmd_write((struct write_frame*) f);
break;
case F_FRAME_ERASE_CMD:
cmd_erase((struct erase_frame*) f);
break;
default:
send_error(F_ERROR_BAD_COMMAND);
}

View File

@@ -222,3 +222,14 @@ void usbWrite(int side, const Fluxmap& fluxmap)
await_reply<struct any_frame>(F_FRAME_WRITE_REPLY);
}
void usbErase(int side)
{
struct erase_frame f = {
.f = { .type = F_FRAME_ERASE_CMD, .size = sizeof(f) },
.side = (uint8_t) side,
};
usb_cmd_send(&f, f.f.size);
await_reply<struct any_frame>(F_FRAME_ERASE_REPLY);
}

View File

@@ -9,5 +9,6 @@ extern nanoseconds_t usbGetRotationalPeriod();
extern void usbTestBulkTransport();
extern std::unique_ptr<Fluxmap> usbRead(int side, int revolutions);
extern void usbWrite(int side, const Fluxmap& fluxmap);
extern void usbErase(int side);
#endif

View File

@@ -73,12 +73,20 @@ void writeTracks(
for (int track=starttrack; track<=endtrack; track++)
{
if ((track < minTrack) || (track > maxTrack))
continue;
for (int side=startside; side<=endside; side++)
{
std::cout << fmt::format("{0:>3}.{1}: ", track, side) << std::flush;
if ((track < minTrack) || (track > maxTrack))
{
if (!outdb)
{
std::cout << "erasing" << std::endl;
usbSeek(track);
usbErase(side);
}
}
else
{
Fluxmap fluxmap = producer(track, side);
fluxmap.precompensate(PRECOMPENSATION_THRESHOLD_TICKS, 2);
if (outdb)
@@ -92,6 +100,7 @@ void writeTracks(
}
}
}
}
void fillBitmapTo(std::vector<bool>& bitmap,
unsigned& cursor, unsigned terminateAt,

View File

@@ -50,7 +50,9 @@ enum
F_FRAME_READ_CMD, /* read_frame */
F_FRAME_READ_REPLY, /* any_frame */
F_FRAME_WRITE_CMD, /* write_frame */
F_FRAME_WRITE_REPLY, /* write_reply_frame */
F_FRAME_WRITE_REPLY, /* any_frame */
F_FRAME_ERASE_CMD, /* erase_frame */
F_FRAME_ERASE_REPLY, /* any_frame */
};
enum
@@ -110,4 +112,10 @@ struct write_frame
uint32_t bytes_to_write;
};
struct erase_frame
{
struct frame_header f;
uint8_t side;
};
#endif