Previous 199869 Revisions Next

r31524 Wednesday 6th August, 2014 at 01:44:07 UTC by Barry Rodewald
amstrad: added support for 64k, 320k, and 576k RAM sizes
        added preliminary support for the SYMBiFACE II board [Barry Rodewald]
idehd:   added Read Native Max Address IDE command
[src/emu/bus]bus.mak
[src/emu/bus/cpc]symbfac2.c* symbfac2.h*
[src/emu/machine]atahle.h idehd.c
[src/mess/drivers]amstrad.c
[src/mess/includes]amstrad.h
[src/mess/machine]amstrad.c

trunk/src/emu/bus/bus.mak
r31523r31524
10631063BUSOBJS += $(BUSOBJ)/cpc/cpc_pds.o
10641064BUSOBJS += $(BUSOBJ)/cpc/cpc_rs232.o
10651065BUSOBJS += $(BUSOBJ)/cpc/mface2.o
1066BUSOBJS += $(BUSOBJ)/cpc/symbfac2.o
10661067endif
10671068
10681069#-------------------------------------------------
trunk/src/emu/bus/cpc/symbfac2.c
r0r31524
1/*
2 * symbfac2.c
3 *   SYMBiFACE II expansion device
4 *    - IDE
5 *    - RTC (Dallas DS1287A)
6 *    - PS/2 compatible mouse connector
7 *    - 512kB RAM expansion
8 *    - 512kB rewritable ROM
9 *
10 *  Created on: 2/08/2014
11 *
12 *  TODO:
13 *    - expansion RAM
14 *    - rewritable ROM
15 *    - mouse controls still need some work
16 */
17
18#include "symbfac2.h"
19
20
21const device_type CPC_SYMBIFACE2 = &device_creator<cpc_symbiface2_device>;
22
23//**************************************************************************
24//  DEVICE CONFIG INTERFACE
25//**************************************************************************
26
27// device machine config
28static MACHINE_CONFIG_FRAGMENT( cpc_symbiface2 )
29   MCFG_ATA_INTERFACE_ADD("ide",ata_devices,"hdd",NULL,false)
30   MCFG_DS12885_ADD("rtc")
31   // no pass-through
32MACHINE_CONFIG_END
33
34static INPUT_PORTS_START(cpc_symbiface2)
35   PORT_START("sf2_mouse_x")
36   PORT_BIT(0x3f , 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_REVERSE PORT_PLAYER(1) PORT_CODE(MOUSECODE_X) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
37
38   PORT_START("sf2_mouse_y")
39   PORT_BIT(0x3f , 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_PLAYER(1) PORT_CODE(MOUSECODE_Y) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
40
41   PORT_START("sf2_mouse_buttons")
42   PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse left button") PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
43   PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse right button") PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
44   PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse middle button") PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
45   PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse back button") PORT_CODE(MOUSECODE_BUTTON4) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
46   PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse forward button") PORT_CODE(MOUSECODE_BUTTON5) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
47
48   // TODO: mouse scroll wheel support
49//   PORT_START("sf2_mouse_scroll")
50//   PORT_BIT(0x1f , 0, IPT_TRACKBALL_Y)
51//   PORT_SENSITIVITY(100)
52//   PORT_KEYDELTA(10)
53//   PORT_PLAYER(1)
54INPUT_PORTS_END
55
56
57machine_config_constructor cpc_symbiface2_device::device_mconfig_additions() const
58{
59   return MACHINE_CONFIG_NAME( cpc_symbiface2 );
60}
61
62ioport_constructor cpc_symbiface2_device::device_input_ports() const
63{
64   return INPUT_PORTS_NAME( cpc_symbiface2 );
65}
66
67//**************************************************************************
68//  LIVE DEVICE
69//**************************************************************************
70
71cpc_symbiface2_device::cpc_symbiface2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
72   device_t(mconfig, CPC_SYMBIFACE2, "SYMBiFACE II", tag, owner, clock, "cpc_symf2", __FILE__),
73   device_cpc_expansion_card_interface(mconfig, *this),
74   m_ide(*this,"ide"),
75   m_rtc(*this,"rtc"),
76   m_mouse_x(*this,"sf2_mouse_x"),
77   m_mouse_y(*this,"sf2_mouse_y"),
78   m_mouse_buttons(*this,"sf2_mouse_buttons")
79{
80}
81
82//-------------------------------------------------
83//  device_start - device-specific startup
84//-------------------------------------------------
85
86void cpc_symbiface2_device::device_start()
87{
88   device_t* cpu = machine().device("maincpu");
89   address_space& space = cpu->memory().space(AS_IO);
90
91   space.install_readwrite_handler(0xfd00,0xfd07,0,0,read8_delegate(FUNC(cpc_symbiface2_device::ide_cs1_r),this),write8_delegate(FUNC(cpc_symbiface2_device::ide_cs1_w),this));
92   space.install_readwrite_handler(0xfd08,0xfd0f,0,0,read8_delegate(FUNC(cpc_symbiface2_device::ide_cs0_r),this),write8_delegate(FUNC(cpc_symbiface2_device::ide_cs0_w),this));
93   space.install_read_handler(0xfd10,0xfd10,0,0,read8_delegate(FUNC(cpc_symbiface2_device::mouse_r),this));
94   space.install_readwrite_handler(0xfd14,0xfd15,0,0,read8_delegate(FUNC(cpc_symbiface2_device::rtc_r),this),write8_delegate(FUNC(cpc_symbiface2_device::rtc_w),this));
95}
96
97//-------------------------------------------------
98//  device_reset - device-specific reset
99//-------------------------------------------------
100
101void cpc_symbiface2_device::device_reset()
102{
103   m_iohigh = false;
104   m_mouse_state = PS2_MOUSE_IDLE;
105   m_input_x = m_mouse_x->read() & 0x3f;
106   m_input_y = m_mouse_y->read() & 0x3f;
107}
108
109// IDE controller (custom)
110// #FD00 - CS1
111// #FD08 - CS0
112READ8_MEMBER(cpc_symbiface2_device::ide_cs0_r)
113{
114   // data is returned in words, so it must be buffered
115   if(offset == 0x00) // data register
116   {
117      if(m_iohigh)
118      {
119         m_iohigh = false;
120         return m_ide_data >> 8;
121      }
122      else
123      {
124         m_iohigh = true;
125         m_ide_data = m_ide->read_cs0(space,offset);
126         return m_ide_data & 0xff;
127      }
128   }
129   else
130      return m_ide->read_cs0(space,offset);
131}
132
133WRITE8_MEMBER(cpc_symbiface2_device::ide_cs0_w)
134{
135   m_ide->write_cs0(space,offset,data);
136}
137
138READ8_MEMBER(cpc_symbiface2_device::ide_cs1_r)
139{
140   return m_ide->read_cs1(space,offset);
141}
142
143WRITE8_MEMBER(cpc_symbiface2_device::ide_cs1_w)
144{
145   m_ide->write_cs1(space,offset,data);
146}
147
148// RTC (Dallas DS1287A)
149// #FD15 (write only) register select
150// #FD14 (read/write) read from or write into selected register
151READ8_MEMBER(cpc_symbiface2_device::rtc_r)
152{
153   switch(offset & 0x01)
154   {
155   case 0x00:
156      return m_rtc->read(space,1);
157   case 0x01:
158      return m_rtc->read(space,0);
159   }
160   return 0;
161}
162
163WRITE8_MEMBER(cpc_symbiface2_device::rtc_w)
164{
165   switch(offset & 0x01)
166   {
167   case 0x00:
168      m_rtc->write(space,1,data);
169      break;
170   case 0x01:
171      m_rtc->write(space,0,data);
172      break;
173   }
174}
175
176// PS/2 Mouse connector
177// #FD10 (read only) read mouse status
178/*
179   Status byte
180   Bit 76543210
181   Use mmDDDDDD
182
183   m: Mode
184   D: Use-Data
185
186   If read and...
187
188   m = 00 -> no more data available, you can stop reading the status for a while
189   m = 01 -> D = X offset (signed); you will receive positive values, if the user
190                            is moving the mouse to the right
191   m = 10 -> D = Y offset (signed); you will receive positive values, if the user
192                            is moving the mouse upwards
193   m = 11 -> D[bit5] = 0 -> D[bit0]   = left button
194                      D[bit1]   = right button
195                      D[bit2]   = middle button
196                      D[bit3]   = forward button
197                      D[bit4]   = backward button
198           D[bit5] = 1 -> D[bit0-4] = scroll wheel offset (signed)
199 */
200READ8_MEMBER(cpc_symbiface2_device::mouse_r)
201{
202   UINT8 ret = 0;
203   int input;
204   int input_diff;
205
206   switch(m_mouse_state)
207   {
208   case PS2_MOUSE_IDLE:
209      m_mouse_state = PS2_MOUSE_IDLE;
210      ret = 0;
211      break;
212   case PS2_MOUSE_X:
213      input = m_mouse_x->read() & 0x3f;
214      input_diff = m_input_x - input;
215      ret = 0x40 | (input_diff & 0x3f);
216      m_input_x = input;
217      m_mouse_state = PS2_MOUSE_Y;
218      break;
219   case PS2_MOUSE_Y:
220      input = m_mouse_y->read() & 0x3f;
221      input_diff = m_input_y - input;
222      ret = 0x80 | (input_diff & 0x3f);
223      m_input_y = input;
224      m_mouse_state = PS2_MOUSE_BUTTONS;
225      break;
226   case PS2_MOUSE_BUTTONS:
227      ret = 0xc0 | (m_mouse_buttons->read() & 0x1f);
228      m_mouse_state = PS2_MOUSE_IDLE;
229      break;
230   case PS2_MOUSE_SCROLL:
231      m_mouse_state = PS2_MOUSE_IDLE;
232      break;  // TODO
233   }
234   //popmessage("Mouse: X: %02x  Y: %02x\n",m_input_x,m_input_y);
235   return ret;
236}
237
238INPUT_CHANGED_MEMBER(cpc_symbiface2_device::mouse_change_x)
239{
240   m_mouse_state = PS2_MOUSE_X;
241}
242
243INPUT_CHANGED_MEMBER(cpc_symbiface2_device::mouse_change_y)
244{
245   m_mouse_state = PS2_MOUSE_Y;
246}
247
248INPUT_CHANGED_MEMBER(cpc_symbiface2_device::mouse_change_buttons)
249{
250   m_mouse_state = PS2_MOUSE_BUTTONS;
251}
252
Property changes on: trunk/src/emu/bus/cpc/symbfac2.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/cpc/symbfac2.h
r0r31524
1/*
2 * symbfac2.h
3 *
4 *  Created on: 2/08/2014
5 */
6
7#ifndef SYMBFAC2_H_
8#define SYMBFAC2_H_
9
10#include "emu.h"
11#include "machine/ataintf.h"
12#include "machine/ds128x.h"
13#include "cpcexp.h"
14
15class cpc_symbiface2_device  : public device_t,
16                        public device_cpc_expansion_card_interface
17{
18public:
19   // construction/destruction
20   cpc_symbiface2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
21
22   // optional information overrides
23   virtual machine_config_constructor device_mconfig_additions() const;
24   virtual ioport_constructor device_input_ports() const;
25
26   DECLARE_READ8_MEMBER(ide_cs0_r);
27   DECLARE_WRITE8_MEMBER(ide_cs0_w);
28   DECLARE_READ8_MEMBER(ide_cs1_r);
29   DECLARE_WRITE8_MEMBER(ide_cs1_w);
30   DECLARE_READ8_MEMBER(rtc_r);
31   DECLARE_WRITE8_MEMBER(rtc_w);
32   DECLARE_READ8_MEMBER(mouse_r);
33   DECLARE_INPUT_CHANGED_MEMBER(mouse_change_x);
34   DECLARE_INPUT_CHANGED_MEMBER(mouse_change_y);
35   DECLARE_INPUT_CHANGED_MEMBER(mouse_change_buttons);
36
37   enum
38   {
39      PS2_MOUSE_IDLE = 0,
40      PS2_MOUSE_X,
41      PS2_MOUSE_Y,
42      PS2_MOUSE_BUTTONS,
43      PS2_MOUSE_SCROLL
44   };
45protected:
46   // device-level overrides
47   virtual void device_start();
48   virtual void device_reset();
49
50private:
51   //cpc_expansion_slot_device *m_slot;
52   required_device<ata_interface_device> m_ide;
53   required_device<ds12885_device> m_rtc;
54
55   required_ioport m_mouse_x;
56   required_ioport m_mouse_y;
57   required_ioport m_mouse_buttons;
58
59   bool m_iohigh;
60   UINT16 m_ide_data;
61
62   UINT8 m_mouse_state;
63   UINT8 m_input_x;
64   UINT8 m_input_y;
65};
66
67// device type definition
68extern const device_type CPC_SYMBIFACE2;
69
70
71#endif /* SYMBFAC2_H_ */
Property changes on: trunk/src/emu/bus/cpc/symbfac2.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/machine/idehd.c
r31523r31524
214214
215215void ata_mass_storage_device::finished_command()
216216{
217   int total_sectors = m_num_cylinders * m_num_heads * m_num_sectors;
218
217219   switch (m_command)
218220   {
219221   case IDE_COMMAND_IDENTIFY_DEVICE:
r31523r31524
261263      set_irq(ASSERT_LINE);
262264      break;
263265
266   case IDE_COMMAND_READ_NATIVE_MAX_ADDRESS:
267      m_buffer[0] = (total_sectors & 0xff000000) >> 24;
268      m_buffer[1] = (total_sectors & 0x00ff0000) >> 16;
269      m_buffer[2] = (total_sectors & 0x0000ff00) >> 8;
270      m_buffer[3] = (total_sectors & 0x000000ff);
271      set_irq(ASSERT_LINE);
272      break;
273
264274   default:
265275      ata_hle_device::finished_command();
266276      break;
r31523r31524
712722      set_irq(ASSERT_LINE);
713723      break;
714724
725   case IDE_COMMAND_READ_NATIVE_MAX_ADDRESS:
726      start_busy(MINIMUM_COMMAND_TIME, PARAM_COMMAND);
727      break;
728
715729   default:
716730      ata_hle_device::process_command();
717731      break;
trunk/src/emu/machine/atahle.h
r31523r31524
128128      IDE_COMMAND_IDENTIFY_DEVICE = 0xec,
129129      IDE_COMMAND_SET_FEATURES = 0xef,
130130      IDE_COMMAND_SECURITY_UNLOCK = 0xf2,
131      IDE_COMMAND_READ_NATIVE_MAX_ADDRESS = 0xf8,
131132      IDE_COMMAND_SET_MAX = 0xf9
132133   };
133134
trunk/src/mess/drivers/amstrad.c
r31523r31524
815815   SLOT_INTERFACE("pds", CPC_PDS)
816816   SLOT_INTERFACE("rs232", CPC_RS232)
817817   SLOT_INTERFACE("amsrs232", CPC_RS232_AMS)
818   SLOT_INTERFACE("sf2", CPC_SYMBIFACE2)
818819SLOT_INTERFACE_END
819820
820821SLOT_INTERFACE_START(cpcplus_exp_cards)
r31523r31524
824825   SLOT_INTERFACE("pds", CPC_PDS)
825826   SLOT_INTERFACE("rs232", CPC_RS232)
826827   SLOT_INTERFACE("amsrs232", CPC_RS232_AMS)
828   SLOT_INTERFACE("sf2", CPC_SYMBIFACE2)
827829SLOT_INTERFACE_END
828830
829831static MACHINE_CONFIG_START( amstrad_nofdc, amstrad_state )
r31523r31524
896898   /* internal ram */
897899   MCFG_RAM_ADD(RAM_TAG)
898900   MCFG_RAM_DEFAULT_SIZE("128K")
901   MCFG_RAM_EXTRA_OPTIONS("64K,320K,576K")
899902MACHINE_CONFIG_END
900903
901904FLOPPY_FORMATS_MEMBER( amstrad_state::floppy_formats )
trunk/src/mess/machine/amstrad.c
r31523r31524
12701270   int ConfigurationIndex = m_GateArray_RamConfiguration & 0x07;
12711271   int BankIndex,i;
12721272   unsigned char *BankAddr;
1273   UINT8 banknum = (m_GateArray_RamConfiguration & 0x38) >> 3;
12731274
12741275/* if b5 = 0 */
1275   if(((m_GateArray_RamConfiguration) & (1<<5)) == 0)
1276   if(m_ram->size() > 65536)
12761277   {
12771278      for (i=0;i<4;i++)
12781279      {
12791280         BankIndex = RamConfigurations[(ConfigurationIndex << 2) + i];
1280         BankAddr = m_ram->pointer() + (BankIndex << 14);
1281         if(BankIndex > 3)
1282         {
1283            UINT8 maxbank = ((m_ram->size()-65536) / 65536);
1284            BankAddr = m_ram->pointer() + (BankIndex << 14) + ((banknum%maxbank)*0x10000);
1285         }
1286         else
1287            BankAddr = m_ram->pointer() + (BankIndex << 14);
12811288         m_Aleste_RamBanks[i] = BankAddr;
12821289         m_AmstradCPC_RamBanks[i] = BankAddr;
12831290      }
12841291   }
12851292   else
1286   {/* Need to add the ram expansion configuration here ! */
1293   {
1294      // set normal 64k RAM mapping
1295      for (i=0;i<4;i++)
1296      {
1297         BankAddr = m_ram->pointer() + (i << 14);
1298         m_Aleste_RamBanks[i] = BankAddr;
1299         m_AmstradCPC_RamBanks[i] = BankAddr;
1300      }
12871301   }
12881302   amstrad_rethinkMemory();
12891303}
trunk/src/mess/includes/amstrad.h
r31523r31524
2020#include "bus/cpc/mface2.h"
2121#include "bus/cpc/cpc_pds.h"
2222#include "bus/cpc/cpc_rs232.h"
23#include "bus/cpc/symbfac2.h"
2324#include "machine/ram.h"
2425#include "imagedev/cassette.h"
2526#include "bus/centronics/ctronics.h"

Previous 199869 Revisions Next


© 1997-2024 The MAME Team