summaryrefslogtreecommitdiffhomepage
path: root/mixlib/xmix_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'mixlib/xmix_device.c')
-rw-r--r--mixlib/xmix_device.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/mixlib/xmix_device.c b/mixlib/xmix_device.c
index 8d4084c..6fb085f 100644
--- a/mixlib/xmix_device.c
+++ b/mixlib/xmix_device.c
@@ -143,14 +143,20 @@ read_ (mix_device_t *dev, mix_word_t *block)
}
static gboolean
-ioc_ (mix_device_t *dev, mix_short_t arg)
+ioc_ (mix_device_t *dev, mix_short_t arg, mix_word_t val)
{
int m;
FILE *file;
+ long diskblock;
m = mix_short_magnitude(arg);
if (mix_short_is_negative(arg)) m = -m;
m *= sizeof (mix_word_t) * SIZES_[dev->type];
+
+ diskblock = mix_word_magnitude(val);
+ if (mix_word_is_negative(val)) diskblock = -diskblock;
+ diskblock *= sizeof (mix_word_t) * SIZES_[dev->type];
+
file = mix_io_to_FILE (GET_CHANNEL_(dev));
if (dev->type >= mix_dev_TAPE_0 && dev->type <= mix_dev_TAPE_7)
@@ -160,12 +166,13 @@ ioc_ (mix_device_t *dev, mix_short_t arg)
}
if (dev->type >= mix_dev_DISK_0 && dev->type <= mix_dev_DISK_7)
{
- if (m == 0) return FALSE;
- // position disk
+ // move read/write head to block
+ if (m != 0 || diskblock < 0) return FALSE;
+ else fseek (file, diskblock, SEEK_SET);
}
if (dev->type == mix_dev_PAPER_TAPE)
{
- if (m == 0) return FALSE;
+ if (m != 0) return FALSE;
rewind (file);
}
return TRUE;