]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Mainhattan Data Paradox SCSI.
authorToni Wilen <twilen@winuae.net>
Mon, 29 Jun 2015 11:38:31 +0000 (14:38 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 29 Jun 2015 11:38:31 +0000 (14:38 +0300)
cia.cpp
expansion.cpp
include/autoconf.h
include/rommgr.h
include/scsi.h
scsi.cpp

diff --git a/cia.cpp b/cia.cpp
index d5d06d872b56f49ab8754daf6843d341fc2186bc..57ebf81f1f962cf5aee0cb4fa4b96e800fa25f12 100644 (file)
--- 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:
index 67f8e37999c875eca80b159a67f758b4f4bdb438..b82c8be894ffe6f6cb599b2438c44746b5d74e65 100644 (file)
@@ -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,
index 98c048dadec2490edc4874053facae0634718ade..ac2226c717f7c15796a8b84c795a70b2fa726994 100644 (file)
@@ -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;
index 349f9d38ea37865566de8d9928955f410767f851..742e50d7a0d2c32ea289bb6b94cd55e30b356754 100644 (file)
@@ -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
index 1c648db39d931647070db85dfc8bfcd22c3b06d7..6d32d8c57442ccf8118ecdf1522939299a785917 100644 (file)
@@ -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);
index 03b1af91285f16d7ca182e4e7c71b62f1e58ac00..7a1030da980b30cea3a87f373b5f102fd723e472 100644 (file)
--- 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;