#include "autoconf.h"
#include "uae/ppc.h"
#include "rommgr.h"
+#include "scsi.h"
#define CIAA_DEBUG_R 0
#define CIAA_DEBUG_W 0
} else if (currprefs.win32_samplersoundcard >= 0) {
tmp = sampler_getsample ((ciabpra & 4) ? 1 : 0);
-
- } else
#endif
- {
+ } else if (parallel_port_scsi) {
+
+ tmp = parallel_port_scsi_read(0, ciaaprb, ciaadrb);
+
+ } else {
tmp = handle_parport_joystick (0, ciaaprb, ciaadrb);
tmp = dongle_cia_read (1, reg, tmp);
#if DONGLE_DEBUG > 0
uae_u8 v;
parallel_direct_read_status (&v);
tmp |= v & 7;
+ } else if (parallel_port_scsi) {
+ tmp = parallel_port_scsi_read(1, ciabpra, ciabdra);
} else {
tmp |= handle_parport_joystick (1, ciabpra, ciabdra);
}
} else if (arcadia_bios) {
arcadia_parport (1, ciaaprb, ciaadrb);
#endif
+ } else if (parallel_port_scsi) {
+ parallel_port_scsi_write(0, ciaaprb, ciaadrb);
}
#endif
break;
serial_writestatus(ciabpra, ciabdra);
#endif
#ifdef PARALLEL_PORT
- if (isprinter () < 0)
+ if (isprinter () < 0) {
parallel_direct_write_status (val, ciabdra);
+ } else if (parallel_port_scsi) {
+ parallel_port_scsi_write(1, ciabpra, ciabdra);
+ }
#endif
break;
case 1:
true, EXPANSIONTYPE_SCSI,
2079, 3, 0
},
+ {
+ _T("paradox"), _T("Paradox SCSI"), _T("Mainhattan Data"),
+ paradox_init, NULL, paradox_add_scsi_unit, ROMTYPE_PARADOX | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, false,
+ NULL, 0,
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_PARALLEL_ADAPTER
+ },
{
_T("mtecat"), _T("AT 500"), _T("M-Tec"),
mtec_init, NULL, mtec_add_ide_unit, ROMTYPE_MTEC, 0, 0, BOARD_AUTOCONFIG_Z2, false,
#define EXPANSIONTYPE_IDE_PORT_DOUBLED 8
#define EXPANSIONTYPE_SASI 16
#define EXPANSIONTYPE_PCI_BRIDGE 32
+#define EXPANSIONTYPE_PARALLEL_ADAPTER 64
struct expansionboardsettings
{
const TCHAR *name;
#define ROMTYPE_TECMAR 0x00100022
#define ROMTYPE_XEBEC 0x00100023
#define ROMTYPE_MICROFORGE 0x00100024
+#define ROMTYPE_PARADOX 0x00100025
#define ROMTYPE_NOT 0x00800000
#define ROMTYPE_QUAD 0x01000000
void soft_scsi_free(void);
void soft_scsi_reset(void);
+uae_u8 parallel_port_scsi_read(int reg, uae_u8 data, uae_u8 dir);
+void parallel_port_scsi_write(int reg, uae_u8 v, uae_u8 dir);
+extern bool parallel_port_scsi;
+
addrbank *supra_init(struct romconfig*);
void supra_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
addrbank *microforge_init(struct romconfig *rc);
void microforge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+
+addrbank *paradox_init(struct romconfig *rc);
+void paradox_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
#include "newcpu.h"
#include "custom.h"
#include "gayle.h"
+#include "cia.h"
#define SCSI_EMU_DEBUG 0
#define RAW_SCSI_DEBUG 1
#define NONCR_TECMAR 15
#define NCR5380_XEBEC 16
#define NONCR_MICROFORGE 17
-#define NCR_LAST 18
+#define NONCR_PARADOX 18
+#define NCR_LAST 19
extern int log_scsiemu;
#define MAX_SOFT_SCSI_UNITS 10
static struct soft_scsi *soft_scsi_devices[MAX_SOFT_SCSI_UNITS];
static struct soft_scsi *soft_scsi_units[NCR_LAST * MAX_DUPLICATE_EXPANSION_BOARDS];
+bool parallel_port_scsi;
+static struct soft_scsi *parallel_port_scsi_data;
static void soft_scsi_free_unit(struct soft_scsi *s)
{
#endif
}
+// mainhattan paradox scsi
+uae_u8 parallel_port_scsi_read(int reg, uae_u8 data, uae_u8 dir)
+{
+ struct soft_scsi *scsi = parallel_port_scsi_data;
+ if (!scsi)
+ return data;
+ struct raw_scsi *rs = &scsi->rscsi;
+ uae_u8 t = raw_scsi_get_signal_phase(rs);
+ if (reg == 0) {
+ data = raw_scsi_get_data_2(rs, true, false);
+ data ^= 0xff;
+ } else if (reg == 1) {
+ data &= ~3;
+ if (rs->bus_phase >= 0 && !(rs->bus_phase & SCSI_IO_COMMAND))
+ data |= 2; // POUT
+ data |= 1;
+ if (rs->bus_phase == SCSI_SIGNAL_PHASE_SELECT_2 || rs->bus_phase >= 0)
+ data &= ~1; // BUSY
+ }
+ t = raw_scsi_get_signal_phase(rs);
+ if ((t & SCSI_IO_REQ) && (scsi->chip_state & 4))
+ cia_parallelack();
+ return data;
+}
+void parallel_port_scsi_write(int reg, uae_u8 v, uae_u8 dir)
+{
+ struct soft_scsi *scsi = parallel_port_scsi_data;
+ if (!scsi)
+ return;
+ struct raw_scsi *rs = &scsi->rscsi;
+ if (reg == 0) {
+ v ^= 0xff;
+ raw_scsi_put_data(rs, v, true);
+ } else if (reg == 1) {
+ // SEL
+ if (!(v & 4) && (scsi->chip_state & 4)) {
+ raw_scsi_set_signal_phase(rs, false, true, false);
+ } else if ((v & 4) && !(scsi->chip_state & 4)) {
+ if (rs->bus_phase == SCSI_SIGNAL_PHASE_SELECT_2) {
+ raw_scsi_set_signal_phase(rs, false, false, false);
+ }
+ }
+ scsi->chip_state = v;
+ }
+ uae_u8 t = raw_scsi_get_signal_phase(rs);
+ if ((t & SCSI_IO_REQ) && (scsi->chip_state & 4))
+ cia_parallelack();
+}
+
static uae_u32 REGPARAM2 ncr80_lget(struct soft_scsi *ncr, uaecptr addr)
{
uae_u32 v;
generic_soft_scsi_add(ch, ci, rc, NCR5380_XEBEC, 65536, 0, ROMTYPE_XEBEC);
}
+addrbank *paradox_init(struct romconfig *rc)
+{
+ struct soft_scsi *scsi = getscsi(rc);
+
+ if (!scsi)
+ return NULL;
+
+ scsi->configured = 1;
+ parallel_port_scsi = true;
+ parallel_port_scsi_data = scsi;
+
+ return NULL;
+}
+
+void paradox_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+ generic_soft_scsi_add(ch, ci, rc, NONCR_PARADOX, 0, 0, ROMTYPE_PARADOX);
+}
+
void soft_scsi_free(void)
{
+ parallel_port_scsi = false;
for (int i = 0; soft_scsi_devices[i]; i++) {
soft_scsi_free_unit(soft_scsi_devices[i]);
soft_scsi_devices[i] = NULL;