mirror of
https://github.com/pevans/erc-c.git
synced 2025-02-17 07:32:05 +00:00
Add image type, image segment
This commit is contained in:
parent
c010c10ce2
commit
2dd21f1487
@ -16,6 +16,19 @@ typedef struct apple2dd apple2dd;
|
|||||||
#include "vm_bits.h"
|
#include "vm_bits.h"
|
||||||
#include "vm_segment.h"
|
#include "vm_segment.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define the kind of image types that our disk media currently has. The
|
||||||
|
* image type is something which is given to us when the disk is
|
||||||
|
* "inserted", and it can't be changed during machine operation.
|
||||||
|
* Well--it could--but we don't have a good reason to do so.
|
||||||
|
*/
|
||||||
|
enum apple2_dd_type {
|
||||||
|
DD_NOTYPE,
|
||||||
|
DD_DOS33,
|
||||||
|
DD_PRODOS,
|
||||||
|
DD_NIBBLE,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These are the possible modes a drive can be in.
|
* These are the possible modes a drive can be in.
|
||||||
*/
|
*/
|
||||||
@ -116,10 +129,16 @@ struct apple2dd {
|
|||||||
int sector_pos;
|
int sector_pos;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The data field is where the actual byte data for the image is
|
* The data segment holds the literal data that the software running
|
||||||
* kept.
|
* in an Apple II would expect to see when accessing the device,
|
||||||
|
* which is to say, data that is 6-and-2 encoded. The image segment
|
||||||
|
* holds the data we literally read from a disk image file, which
|
||||||
|
* (in most cases) is not 6-and-2 encoded. We also define an image
|
||||||
|
* type (see apple2_dd_type for enums).
|
||||||
*/
|
*/
|
||||||
vm_segment *data;
|
vm_segment *data;
|
||||||
|
vm_segment *image;
|
||||||
|
int image_type;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A disk drive may be "off" or "on", regardless of whether it's
|
* A disk drive may be "off" or "on", regardless of whether it's
|
||||||
@ -160,7 +179,7 @@ struct apple2dd {
|
|||||||
extern SEGMENT_READER(apple2_dd_switch_read);
|
extern SEGMENT_READER(apple2_dd_switch_read);
|
||||||
extern SEGMENT_WRITER(apple2_dd_switch_write);
|
extern SEGMENT_WRITER(apple2_dd_switch_write);
|
||||||
extern apple2dd *apple2_dd_create();
|
extern apple2dd *apple2_dd_create();
|
||||||
extern int apple2_dd_insert(apple2dd *, FILE *);
|
extern int apple2_dd_insert(apple2dd *, FILE *, int);
|
||||||
extern int apple2_dd_position(apple2dd *);
|
extern int apple2_dd_position(apple2dd *);
|
||||||
extern vm_8bit apple2_dd_read(apple2dd *);
|
extern vm_8bit apple2_dd_read(apple2dd *);
|
||||||
extern void apple2_dd_eject(apple2dd *);
|
extern void apple2_dd_eject(apple2dd *);
|
||||||
|
@ -213,6 +213,8 @@ apple2_is_double_video(apple2 *mach)
|
|||||||
/*
|
/*
|
||||||
* Try to "boot" the apple2 machine. Look for input sources indicated in
|
* Try to "boot" the apple2 machine. Look for input sources indicated in
|
||||||
* the option system and load those into our disk drives.
|
* the option system and load those into our disk drives.
|
||||||
|
*
|
||||||
|
* FIXME: we need to get the image type from the file name used
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
apple2_boot(apple2 *mach)
|
apple2_boot(apple2 *mach)
|
||||||
@ -223,7 +225,7 @@ apple2_boot(apple2 *mach)
|
|||||||
// Do we have any disks?
|
// Do we have any disks?
|
||||||
stream = option_get_input(1);
|
stream = option_get_input(1);
|
||||||
if (stream) {
|
if (stream) {
|
||||||
err = apple2_dd_insert(mach->drive1, stream);
|
err = apple2_dd_insert(mach->drive1, stream, DD_DOS33);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
log_critical("Unable to insert disk1 into drive");
|
log_critical("Unable to insert disk1 into drive");
|
||||||
return err;
|
return err;
|
||||||
@ -232,7 +234,7 @@ apple2_boot(apple2 *mach)
|
|||||||
|
|
||||||
stream = option_get_input(2);
|
stream = option_get_input(2);
|
||||||
if (stream) {
|
if (stream) {
|
||||||
err = apple2_dd_insert(mach->drive2, stream);
|
err = apple2_dd_insert(mach->drive2, stream, DD_DOS33);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
log_critical("Unable to insert disk2 into drive");
|
log_critical("Unable to insert disk2 into drive");
|
||||||
return err;
|
return err;
|
||||||
|
@ -25,6 +25,7 @@ apple2_dd_create()
|
|||||||
// will depend on the disk you insert. For example, a DOS 3.3 or
|
// will depend on the disk you insert. For example, a DOS 3.3 or
|
||||||
// ProDOS disk will have 140k, but a NIB file would have more.
|
// ProDOS disk will have 140k, but a NIB file would have more.
|
||||||
drive->data = NULL;
|
drive->data = NULL;
|
||||||
|
drive->image = NULL;
|
||||||
|
|
||||||
drive->locked = false;
|
drive->locked = false;
|
||||||
drive->track_pos = 0;
|
drive->track_pos = 0;
|
||||||
@ -34,6 +35,7 @@ apple2_dd_create()
|
|||||||
drive->mode = DD_READ;
|
drive->mode = DD_READ;
|
||||||
drive->phase_state = 0;
|
drive->phase_state = 0;
|
||||||
drive->last_phase = 0;
|
drive->last_phase = 0;
|
||||||
|
drive->image_type = DD_NOTYPE;
|
||||||
|
|
||||||
return drive;
|
return drive;
|
||||||
}
|
}
|
||||||
@ -44,7 +46,7 @@ apple2_dd_create()
|
|||||||
* something we cannot accept.
|
* something we cannot accept.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
apple2_dd_insert(apple2dd *drive, FILE *stream)
|
apple2_dd_insert(apple2dd *drive, FILE *stream, int type)
|
||||||
{
|
{
|
||||||
struct stat finfo;
|
struct stat finfo;
|
||||||
int err;
|
int err;
|
||||||
@ -79,6 +81,7 @@ apple2_dd_insert(apple2dd *drive, FILE *stream)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drive->image_type = type;
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,8 @@ TestSuite(apple2_dd, .init = setup, .fini = teardown);
|
|||||||
Test(apple2_dd, create)
|
Test(apple2_dd, create)
|
||||||
{
|
{
|
||||||
cr_assert_eq(drive->data, NULL);
|
cr_assert_eq(drive->data, NULL);
|
||||||
|
cr_assert_eq(drive->image, NULL);
|
||||||
|
cr_assert_eq(drive->image_type, DD_NOTYPE);
|
||||||
cr_assert_eq(drive->track_pos, 0);
|
cr_assert_eq(drive->track_pos, 0);
|
||||||
cr_assert_eq(drive->sector_pos, 0);
|
cr_assert_eq(drive->sector_pos, 0);
|
||||||
cr_assert_eq(drive->online, false);
|
cr_assert_eq(drive->online, false);
|
||||||
@ -40,13 +42,14 @@ Test(apple2_dd, insert)
|
|||||||
drive->sector_pos = 33;
|
drive->sector_pos = 33;
|
||||||
|
|
||||||
stream = fopen("../data/zero.img", "r");
|
stream = fopen("../data/zero.img", "r");
|
||||||
cr_assert_eq(apple2_dd_insert(drive, stream), OK);
|
cr_assert_eq(apple2_dd_insert(drive, stream, DD_DOS33), OK);
|
||||||
cr_assert_eq(drive->track_pos, 0);
|
cr_assert_eq(drive->track_pos, 0);
|
||||||
cr_assert_eq(drive->sector_pos, 0);
|
cr_assert_eq(drive->sector_pos, 0);
|
||||||
|
cr_assert_eq(drive->image_type, DD_DOS33);
|
||||||
fclose(stream);
|
fclose(stream);
|
||||||
|
|
||||||
stream = fopen("../data/bad.img", "r");
|
stream = fopen("../data/bad.img", "r");
|
||||||
cr_assert_eq(apple2_dd_insert(drive, stream), ERR_BADFILE);
|
cr_assert_eq(apple2_dd_insert(drive, stream, DD_DOS33), ERR_BADFILE);
|
||||||
fclose(stream);
|
fclose(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user