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:
parent
256e0cf1d6
commit
079a35507c
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user