1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-12-21 23:29:16 +00:00

A number of updates in heavy dev phase

1. Add an insert function (to insert a new disk).
2. Add a new shift function to coordinate sector position updates when
reading or writing.
This commit is contained in:
Peter Evans 2017-12-15 16:45:20 -06:00
parent 256e0cf1d6
commit 079a35507c

View File

@ -59,6 +59,46 @@ apple2dd_free(apple2dd *drive)
free(drive); free(drive);
} }
int
apple2dd_insert(apple2dd *drive, FILE *stream)
{
struct stat finfo;
if (stream == NULL) {
log_critical("File stream is null");
return ERR_BADFILE;
}
// How large is this data set? Let's get the stat info.
if (fstat(fileno(stream), &finfo)) {
log_critical("Couldn't inspect file stream: %s", strerror(errno));
return ERR_BADFILE;
}
if (finfo.st_size != _140K_) {
log_critical("Unexpected file format (file size = %d)", finfo.st_size);
return ERR_BADFILE;
}
// If we have any data, get rid of it. We'll start fresh here.
apple2dd_eject(drive);
drive->data = vm_segment_create(finfo.st_size);
drive->track_pos = 0;
drive->sector_pos = 0;
return OK;
}
void
apple2dd_eject(apple2dd *drive)
{
if (drive->data) {
vm_segment_free(drive->data);
drive->data = NULL;
}
}
void void
apple2dd_step(apple2dd *drive, int steps) apple2dd_step(apple2dd *drive, int steps)
{ {
@ -115,18 +155,26 @@ apple2dd_position(apple2dd *drive)
return 0; return 0;
} }
void
apple2dd_shift(apple2dd *drive, int pos)
{
drive->sector_pos += pos;
if (drive->sector_pos > MAX_SECTOR_POS) {
// We need to reset the sector pos to zero, because...
drive->sector_pos = 0;
// We also need to move to the next track, so let's adjust by
// two half-tracks.
apple2dd_step(drive, 2);
}
}
vm_8bit vm_8bit
apple2dd_read_byte(apple2dd *drive) apple2dd_read_byte(apple2dd *drive)
{ {
vm_8bit byte = vm_segment_get(drive->data, apple2dd_position(drive)); vm_8bit byte = vm_segment_get(drive->data, apple2dd_position(drive));
apple2dd_shift(drive, 1);
// We may have read the very last byte in a sector; if so let's
// adjust the track_pos by two half tracks and reset the sector pos.
drive->sector_pos++;
if (drive->sector_pos > MAX_SECTOR_POS) {
drive->track_pos += 2;
drive->sector_pos = 0;
}
return byte; return byte;
} }
@ -135,10 +183,5 @@ void
apple2dd_write(apple2dd *drive, vm_8bit byte) apple2dd_write(apple2dd *drive, vm_8bit byte)
{ {
vm_segment_set(drive->data, apple2dd_position(drive), byte); vm_segment_set(drive->data, apple2dd_position(drive), byte);
apple2dd_shift(drive, 1);
drive->sector_pos++;
if (drive->sector_pos > MAX_SECTOR_POS) {
drive->track_pos += 2;
drive->sector_pos = 0;
}
} }