|
@@ -8,6 +8,7 @@
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#include "common.h"
|
|
|
+#include "config.h"
|
|
|
#include "io.h"
|
|
|
#include "abcio.h"
|
|
|
#include "console.h"
|
|
@@ -65,8 +66,9 @@ struct drive_state {
|
|
|
|
|
|
/* Fixed parameters for each controller */
|
|
|
struct ctl_params {
|
|
|
+ enum sysvar_enum enable; /* Enable configuration variable */
|
|
|
+ enum sysvar_enum devsel; /* Device select code variable */
|
|
|
uint8_t clustshift; /* log2(clustersize/256) */
|
|
|
- uint8_t devsel; /* I/O device select */
|
|
|
uint16_t maxsectors; /* Maximum sectors for this controller */
|
|
|
uint8_t c, h, s; /* Disk geometry */
|
|
|
bool newaddr; /* "New addressing" */
|
|
@@ -86,7 +88,7 @@ struct ctl_state {
|
|
|
uint8_t k[4]; /* Command bytes */
|
|
|
uint8_t drives; /* Total drives present */
|
|
|
uint8_t error; /* Error status */
|
|
|
- bool initialized; /* Controller initialized */
|
|
|
+ bool initialized; /* Controller initialized */
|
|
|
volatile enum pending pending; /* Need to do I/O */
|
|
|
struct drive_state drv[8]; /* Per-drive state */
|
|
|
uint8_t buf[4][256]; /* 4 host buffers @ 256 bytes */
|
|
@@ -110,6 +112,7 @@ enum controller_types {
|
|
|
MFx,
|
|
|
SFx,
|
|
|
HDx,
|
|
|
+ XDx,
|
|
|
CONTROLLER_TYPES
|
|
|
};
|
|
|
|
|
@@ -127,7 +130,8 @@ static const struct ctl_params parameters[CONTROLLER_TYPES] = {
|
|
|
* DSDD = 40×16×2 (320K, FD4D/DD84/DD52)
|
|
|
*/
|
|
|
[MOx] = {
|
|
|
- .devsel = 45,
|
|
|
+ .enable = config_abc_io_mo_enable,
|
|
|
+ .devsel = config_abc_io_mo_devsel,
|
|
|
.clustshift = 0,
|
|
|
.maxsectors = 40 * 2 * 16,
|
|
|
.c = 40, .h = 2, .s = 16,
|
|
@@ -140,7 +144,8 @@ static const struct ctl_params parameters[CONTROLLER_TYPES] = {
|
|
|
|
|
|
/* MFx: DSQD = 80×16x2 (640K, ABC832/834) */
|
|
|
[MFx] = {
|
|
|
- .devsel = 44,
|
|
|
+ .enable = config_abc_io_mf_enable,
|
|
|
+ .devsel = config_abc_io_mf_devsel,
|
|
|
.clustshift = 2,
|
|
|
.maxsectors = 80 * 2 * 16,
|
|
|
.c = 80, .h = 2, .s = 16,
|
|
@@ -149,7 +154,8 @@ static const struct ctl_params parameters[CONTROLLER_TYPES] = {
|
|
|
|
|
|
/* SFx: 8" floppy (DD88, ABC838) */
|
|
|
[SFx] = {
|
|
|
- .devsel = 46,
|
|
|
+ .enable = config_abc_io_sf_enable,
|
|
|
+ .devsel = config_abc_io_sf_devsel,
|
|
|
.clustshift = 2,
|
|
|
.maxsectors = (77 * 2 - 1) * 26, /* Track 0, side 0 not used */
|
|
|
.c = 77, .h = 2, .s = 26,
|
|
@@ -157,13 +163,25 @@ static const struct ctl_params parameters[CONTROLLER_TYPES] = {
|
|
|
},
|
|
|
|
|
|
[HDx] = {
|
|
|
- .devsel = 36,
|
|
|
+ .enable = config_abc_io_hd_enable,
|
|
|
+ .devsel = config_abc_io_hd_devsel,
|
|
|
.clustshift = 5,
|
|
|
.newaddr = true, /* Actually irrelevant for clustshift = 5 */
|
|
|
.maxsectors = (239 * 8 - 1) * 32, /* Maximum supported by UFD-DOS */
|
|
|
.c = 238, .h = 16, .s = 64,
|
|
|
.name = "hd"
|
|
|
- }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* Second harddisk */
|
|
|
+ [XDx] = {
|
|
|
+ .enable = config_abc_io_xd_enable,
|
|
|
+ .devsel = config_abc_io_xd_devsel,
|
|
|
+ .clustshift = 5,
|
|
|
+ .newaddr = true, /* Actually irrelevant for clustshift = 5 */
|
|
|
+ .maxsectors = (239 * 8 - 1) * 32, /* Maximum supported by UFD-DOS */
|
|
|
+ .c = 238, .h = 16, .s = 64,
|
|
|
+ .name = "xd"
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
static struct ctl_state __dram_bss controllers[CONTROLLER_TYPES];
|
|
@@ -779,13 +797,30 @@ void abcdisk_init(void)
|
|
|
.callback_rst = abcdisk_callback_rst
|
|
|
};
|
|
|
|
|
|
- for (int i = 0; i < CONTROLLER_TYPES; i++) {
|
|
|
+ for (size_t i = 0; i < CONTROLLER_TYPES; i++) {
|
|
|
struct ctl_state * const state = &controllers[i];
|
|
|
|
|
|
- state->params = ¶meters[i];
|
|
|
- state->iodev = iodev_template;
|
|
|
+ state->params = ¶meters[i];
|
|
|
+ state->iodev = iodev_template;
|
|
|
+ state->iodev.name = state->params->name;
|
|
|
|
|
|
disk_reset_state(state);
|
|
|
- abc_register(&state->iodev, state->params->devsel);
|
|
|
+ }
|
|
|
+
|
|
|
+ abcdisk_config();
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Called during initialization; can also be called on reconfig.
|
|
|
+ */
|
|
|
+void abcdisk_config(void)
|
|
|
+{
|
|
|
+ for (size_t i = 0; i < CONTROLLER_TYPES; i++) {
|
|
|
+ struct ctl_state * const state = &controllers[i];
|
|
|
+
|
|
|
+ unsigned int devsel = getvar_uint(state->params->devsel);
|
|
|
+ if (!getvar_bool(state->params->enable))
|
|
|
+ devsel = DEVSEL_NONE;
|
|
|
+ abc_register(&state->iodev, devsel);
|
|
|
}
|
|
|
}
|