From 9d64f7fff12769105116b8e4a8647ddb36e95553 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Mon, 29 Jun 2015 14:38:31 +0300 Subject: [PATCH] Mainhattan Data Paradox SCSI. --- cia.cpp | 18 ++++++++--- expansion.cpp | 6 ++++ include/autoconf.h | 1 + include/rommgr.h | 1 + include/scsi.h | 7 +++++ scsi.cpp | 75 +++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 103 insertions(+), 5 deletions(-) diff --git a/cia.cpp b/cia.cpp index d5d06d87..57ebf81f 100644 --- a/cia.cpp +++ b/cia.cpp @@ -42,6 +42,7 @@ #include "autoconf.h" #include "uae/ppc.h" #include "rommgr.h" +#include "scsi.h" #define CIAA_DEBUG_R 0 #define CIAA_DEBUG_W 0 @@ -1029,11 +1030,13 @@ static uae_u8 ReadCIAA (unsigned int addr) } 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 @@ -1169,6 +1172,8 @@ static uae_u8 ReadCIAB (unsigned int addr) 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); } @@ -1322,6 +1327,8 @@ static void WriteCIAA (uae_u16 addr, uae_u8 val) } else if (arcadia_bios) { arcadia_parport (1, ciaaprb, ciaadrb); #endif + } else if (parallel_port_scsi) { + parallel_port_scsi_write(0, ciaaprb, ciaadrb); } #endif break; @@ -1491,8 +1498,11 @@ static void WriteCIAB (uae_u16 addr, uae_u8 val) 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: diff --git a/expansion.cpp b/expansion.cpp index 67f8e379..b82c8be8 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -2586,6 +2586,12 @@ const struct expansionromtype expansionroms[] = { 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, diff --git a/include/autoconf.h b/include/autoconf.h index 98c048da..ac2226c7 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -113,6 +113,7 @@ typedef void(*DEVICE_MEMORY_CALLBACK)(struct romconfig*, uae_u8*, int); #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; diff --git a/include/rommgr.h b/include/rommgr.h index 349f9d38..742e50d7 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -80,6 +80,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_TECMAR 0x00100022 #define ROMTYPE_XEBEC 0x00100023 #define ROMTYPE_MICROFORGE 0x00100024 +#define ROMTYPE_PARADOX 0x00100025 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/include/scsi.h b/include/scsi.h index 1c648db3..6d32d8c5 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -160,6 +160,10 @@ void apollo_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi 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); @@ -209,3 +213,6 @@ void xebec_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig 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); diff --git a/scsi.cpp b/scsi.cpp index 03b1af91..7a1030da 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -22,6 +22,7 @@ #include "newcpu.h" #include "custom.h" #include "gayle.h" +#include "cia.h" #define SCSI_EMU_DEBUG 0 #define RAW_SCSI_DEBUG 1 @@ -45,7 +46,8 @@ #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; @@ -669,6 +671,8 @@ struct soft_scsi #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) { @@ -2518,6 +2522,55 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si #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; @@ -3147,8 +3200,28 @@ void xebec_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig 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; -- 2.47.3