2013-07-06 04:37:13 +00:00
|
|
|
/*
|
2015-10-22 05:13:26 +00:00
|
|
|
* Apple // emulator for *ix
|
|
|
|
*
|
|
|
|
* This software package is subject to the GNU General Public License
|
|
|
|
* version 3 or later (your choice) as published by the Free Software
|
|
|
|
* Foundation.
|
2013-06-11 07:08:15 +00:00
|
|
|
*
|
|
|
|
* Copyright 1994 Alexander Jean-Claude Bottema
|
|
|
|
* Copyright 1995 Stephen Lee
|
|
|
|
* Copyright 1997, 1998 Aaron Culliney
|
|
|
|
* Copyright 1998, 1999, 2000 Michael Deutschmann
|
2015-10-22 05:13:26 +00:00
|
|
|
* Copyright 2013-2015 Aaron Culliney
|
2013-06-11 07:08:15 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef A2_DISK_H
|
2013-12-01 18:57:24 +00:00
|
|
|
#define A2_DISK_H
|
|
|
|
|
|
|
|
#include "common.h"
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2015-10-16 04:23:21 +00:00
|
|
|
#define ERR_IMAGE_NOT_EXPECTED_SIZE "disk image is not expected size"
|
|
|
|
#define ERR_STAT_FAILED "disk image unreadable for stat"
|
|
|
|
#define ERR_CANNOT_OPEN "could not open disk image"
|
|
|
|
#define ERR_MMAP_FAILED "disk image unreadable for mmap"
|
2014-12-28 21:07:13 +00:00
|
|
|
|
|
|
|
#define NUM_TRACKS 35
|
|
|
|
#define NUM_SECTORS 16
|
|
|
|
|
|
|
|
#define DSK_TRACK_SIZE 0x1000 // DOS order, ProDOS order
|
|
|
|
#define NIB_TRACK_SIZE 0x1A00 // NIB format
|
|
|
|
#define NI2_TRACK_SIZE 0x18F0 // NI2 format
|
|
|
|
|
2015-10-16 04:23:21 +00:00
|
|
|
#define DSK_SIZE (NUM_TRACKS * DSK_TRACK_SIZE) // 143360
|
|
|
|
#define NIB_SIZE (NUM_TRACKS * NIB_TRACK_SIZE) // 232960
|
|
|
|
#define NI2_SIZE (NUM_TRACKS * NI2_TRACK_SIZE) // 223440
|
|
|
|
|
2014-12-28 21:07:13 +00:00
|
|
|
#define PHASE_BYTES (NIB_TRACK_SIZE/2)
|
|
|
|
#define NIB_SEC_SIZE (NIB_TRACK_SIZE/NUM_SECTORS)
|
|
|
|
|
|
|
|
#define DSK_VOLUME 254
|
|
|
|
|
2015-10-10 04:32:04 +00:00
|
|
|
#define DISK_EXT_DSK ".dsk"
|
|
|
|
#define _DSKLEN (sizeof(DISK_EXT_DSK)-1)
|
|
|
|
#define DISK_EXT_DO ".do"
|
|
|
|
#define _DOLEN (sizeof(DISK_EXT_DO)-1)
|
|
|
|
#define DISK_EXT_PO ".po"
|
|
|
|
#define _POLEN (sizeof(DISK_EXT_PO)-1)
|
|
|
|
#define DISK_EXT_NIB ".nib"
|
|
|
|
#define _NIBLEN (sizeof(DISK_EXT_NIB)-1)
|
|
|
|
|
2014-12-28 21:07:13 +00:00
|
|
|
typedef struct diskette_t {
|
2015-10-17 04:47:56 +00:00
|
|
|
char *file_name;
|
2015-10-18 23:27:07 +00:00
|
|
|
int fd;
|
|
|
|
uint8_t *mmap_image;
|
|
|
|
size_t whole_len;
|
2015-10-18 22:24:34 +00:00
|
|
|
uint8_t *whole_image;
|
2014-03-26 05:11:01 +00:00
|
|
|
bool nibblized;
|
|
|
|
bool is_protected;
|
2014-12-28 21:07:13 +00:00
|
|
|
bool track_valid;
|
|
|
|
bool track_dirty;
|
|
|
|
int *skew_table;
|
2015-10-11 05:38:57 +00:00
|
|
|
long track_width;
|
2013-06-11 07:08:15 +00:00
|
|
|
int phase;
|
2013-07-06 04:37:13 +00:00
|
|
|
int run_byte;
|
2014-12-28 21:07:13 +00:00
|
|
|
} diskette_t;
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2014-12-28 21:07:13 +00:00
|
|
|
typedef struct drive_t {
|
2015-01-11 20:03:07 +00:00
|
|
|
struct timespec motor_time;
|
|
|
|
int motor_off;
|
2013-06-11 07:08:15 +00:00
|
|
|
int drive;
|
|
|
|
int ddrw;
|
|
|
|
int disk_byte;
|
2014-12-28 21:07:13 +00:00
|
|
|
diskette_t disk[2];
|
|
|
|
} drive_t;
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2014-12-28 21:07:13 +00:00
|
|
|
extern drive_t disk6;
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2015-10-16 04:23:21 +00:00
|
|
|
// initialize emulated 5.25 Disk ][ module
|
|
|
|
extern void disk6_init(void);
|
|
|
|
|
|
|
|
// insert 5.25 disk image file
|
2015-11-23 03:04:46 +00:00
|
|
|
extern const char *disk6_insert(int drive, const char * const file_name, int readonly);
|
2015-10-16 04:23:21 +00:00
|
|
|
|
|
|
|
// eject 5.25 disk image file
|
|
|
|
extern const char *disk6_eject(int drive);
|
|
|
|
|
|
|
|
// flush all I/O
|
|
|
|
extern void disk6_flush(int drive);
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2015-11-23 03:04:46 +00:00
|
|
|
extern bool disk6_saveState(StateHelper_s *helper);
|
|
|
|
extern bool disk6_loadState(StateHelper_s *helper);
|
|
|
|
|
2014-11-15 19:14:01 +00:00
|
|
|
#if DISK_TRACING
|
2016-10-01 16:58:30 +00:00
|
|
|
void disk6_traceToggle(const char *read_file, const char *write_file);
|
|
|
|
void disk6_traceBegin(const char *read_file, const char *write_file);
|
|
|
|
void disk6_traceEnd(void);
|
2014-10-12 01:31:19 +00:00
|
|
|
#endif
|
|
|
|
|
2013-06-11 07:08:15 +00:00
|
|
|
#endif
|