Previous 199869 Revisions Next

r25469 Monday 30th September, 2013 at 23:15:43 UTC by Michael Zapf
(MESS) GROMs may now be used on different bases (needed in 99/8)
[src/mess/machine/ti99]grom.c gromport.c gromport.h

trunk/src/mess/machine/ti99/grom.c
r25468r25469
138138         // GROMs are buffered. Data is retrieved from a buffer,
139139         // while the buffer is replaced with the next cell content.
140140         *value = m_buffer;
141
142141         // Get next value, put it in buffer. Note that the GROM
143142         // wraps at 8K boundaries.
144143         UINT16 addr = m_address-(m_ident<<13);
r25468r25469
149148            m_buffer = m_memptr[addr];
150149      }
151150      // Note that all GROMs update their address counter.
152      m_address = (m_address + 1)&0xFFFF;
151      // TODO: Check this on a real console
152      m_address = (m_address & 0xE000) | ((m_address + 1)&0x1FFF);
153153
154154      // Reset the read and write address flipflops.
155155      m_raddr_LSB = m_waddr_LSB = false;
r25468r25469
206206         UINT16 write_addr;
207207         // We need to rewind by 1 because the read address has already advanced.
208208         // However, do not change the address counter!
209         write_addr = (m_address - 1) & 0xFFFF;
209         write_addr = (m_address & 0xE000) | ((m_address - 1)&0x1FFF);
210210
211211         // UINT16 addr = m_address-(m_ident<<13);
212212         if (m_size > 0x1800 || ((m_address&0x1fff)<0x1800))
r25468r25469
215215      m_raddr_LSB = m_waddr_LSB = false;
216216      clear_ready();
217217   }
218
219   m_address = (m_address + 1) & 0xFFFF;
218   m_address = (m_address & 0xE000) | ((m_address + 1)&0x1FFF);
220219}
221220
222221/*
trunk/src/mess/machine/ti99/gromport.c
r25468r25469
113113#define VERBOSE 1
114114#define LOG logerror
115115
116#define GROM_AREA 0x9800
117#define GROM_MASK 0xf800
118
119116#define GROM3_TAG "grom3"
120117#define GROM4_TAG "grom4"
121118#define GROM5_TAG "grom5"
r25468r25469
175172   m_reset_on_insert = (ioport("CARTRESET")->read()==0x01);
176173}
177174
175void gromport_device::set_grom_base(UINT16 grombase, UINT16 grommask)
176{
177   m_grombase = grombase;
178   m_grommask = grommask;
179}
180
178181/*
179182    Shall we reset the console when a cartridge has been inserted?
180183    This is triggered by the cartridge by pulling down /RESET via a capacitor.
r25468r25469
191194   }
192195}
193196
194
195197void gromport_device::device_config_complete()
196198{
197199   const gromport_config *intf = reinterpret_cast<const gromport_config *>(static_config());
198200   m_console_ready.resolve(intf->ready, *this);
199201   m_console_reset.resolve(intf->reset, *this);
200202   m_connector = static_cast<ti99_cartridge_connector_device*>(first_subdevice());
203   set_grom_base(0x9800, 0xf800);
201204}
202205
203206SLOT_INTERFACE_START( gromport )
r25468r25469
247250   m_gromport->ready_line(state);
248251}
249252
253void ti99_cartridge_connector_device::device_config_complete()
254{
255   m_gromport = static_cast<gromport_device*>(owner());
256}
257
258UINT16 ti99_cartridge_connector_device::grom_base()
259{
260   return m_gromport->get_grom_base();
261}
262
263UINT16 ti99_cartridge_connector_device::grom_mask()
264{
265   return m_gromport->get_grom_mask();
266}
267
250268single_conn_device::single_conn_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
251269   : ti99_cartridge_connector_device(mconfig, GROMPORT_SINGLE, "Standard cartridge connector", tag, owner, clock, "single", __FILE__),
252270   m_cartridge(NULL)
r25468r25469
277295   m_cartridge->cruwrite(offset, data);
278296}
279297
298void single_conn_device::device_start()
299{
300   m_cartridge = static_cast<ti99_cartridge_device*>(first_subdevice());
301}
302
280303void single_conn_device::device_reset()
281304{
282305   m_cartridge->set_slot(0);
r25468r25469
291314   return MACHINE_CONFIG_NAME( single_slot );
292315}
293316
294void single_conn_device::device_config_complete()
295{
296   m_cartridge = static_cast<ti99_cartridge_device*>(first_subdevice());
297   m_gromport = static_cast<gromport_device*>(owner());
298}
299
300317/********************************************************/
301318
302319/*
r25468r25469
403420   int slot;
404421   if (changebase)
405422   {
406      if ((offset & GROM_MASK) == GROM_AREA)
423      if ((offset & grom_mask()) == grom_base())
407424      {
408425         set_slot((offset>>2) & 0x00ff);
409426      }
r25468r25469
432449   // If we have a GROM access, we need to send the read request to all
433450   // attached cartridges so the slot is irrelevant here. Each GROM
434451   // contains an internal address counter, and we must make sure they all stay in sync.
435   if ((offset & GROM_MASK) == GROM_AREA)
452   if ((offset & grom_mask()) == grom_base())
436453   {
437454      for (int i=0; i < NUMBER_OF_CARTRIDGE_SLOTS; i++)
438455      {
r25468r25469
462479
463480   // Same issue as above (read)
464481   // We don't have GRAM cartridges, anyway, so it's just used for setting the address.
465   if ((offset & GROM_MASK) == GROM_AREA)
482   if ((offset & grom_mask()) == grom_base())
466483   {
467484      for (int i=0; i < NUMBER_OF_CARTRIDGE_SLOTS; i++)
468485      {
r25468r25469
517534   {
518535      m_cartridge[i] = NULL;
519536   }
520   m_gromport = static_cast<gromport_device*>(owner());
521537}
522538
523539void multi_conn_device::device_reset(void)
r25468r25469
682698
683699READ8Z_MEMBER(gkracker_device::readz)
684700{
685   if ((offset & GROM_MASK) == GROM_AREA)
701   if ((offset & grom_mask()) == grom_base())
686702   {
687703      // Reads from the GRAM space of the GRAM Kracker.
688704
r25468r25469
792808      m_cartridge->write(space, offset, data, mem_mask);
793809   }
794810
795   if ((offset & GROM_MASK) == GROM_AREA)
811   if ((offset & grom_mask()) == grom_base())
796812   {
797813      // Write to the GRAM space of the GRAM Kracker.
798814      if ((offset & 0x0002)==0x0002)
r25468r25469
973989   m_grom_ptr = memregion(GKRACKER_ROM_TAG)->base();
974990   m_cartridge = NULL;
975991   for (int i=1; i < 6; i++) m_gk_switch[i] = 0;
976   m_gromport = static_cast<gromport_device*>(owner());
977992}
978993
979994void gkracker_device::device_reset()
r25468r25469
11971212   return m_pcb->m_grom_size>0;
11981213}
11991214
1215UINT16 ti99_cartridge_device::grom_base()
1216{
1217   return m_connector->grom_base();
1218}
1219
1220UINT16 ti99_cartridge_device::grom_mask()
1221{
1222   return m_connector->grom_mask();
1223}
1224
12001225bool ti99_cartridge_device::call_load()
12011226{
12021227   // File name is in m_basename
r25468r25469
12731298   }
12741299
12751300   prepare_cartridge();
1301   m_pcb->set_cartridge(this);
12761302   m_slot = get_index_from_tagname();
12771303   m_connector->insert(m_slot, this);
12781304   return false;
r25468r25469
14061432{
14071433}
14081434
1435UINT16 ti99_cartridge_pcb::grom_base()
1436{
1437   return m_cart->grom_base();
1438}
1439
1440UINT16 ti99_cartridge_pcb::grom_mask()
1441{
1442   return m_cart->grom_mask();
1443}
1444
1445void ti99_cartridge_pcb::set_cartridge(ti99_cartridge_device *cart)
1446{
1447   m_cart = cart;
1448}
1449
14091450READ8Z_MEMBER(ti99_cartridge_pcb::gromreadz)
14101451{
14111452   for (int i=0; i < 5; i++)
r25468r25469
14301471
14311472READ8Z_MEMBER(ti99_cartridge_pcb::readz)
14321473{
1433   if ((offset & GROM_MASK)==GROM_AREA)
1474   if ((offset & grom_mask())==grom_base())
14341475      gromreadz(space, offset, value, mem_mask);
14351476   else
14361477   {
r25468r25469
14471488WRITE8_MEMBER(ti99_cartridge_pcb::write)
14481489{
14491490   // LOG("write standard\n");
1450   if ((offset & GROM_MASK)==GROM_AREA)
1491   if ((offset & grom_mask())==grom_base())
14511492      gromwrite(space, offset, data, mem_mask);
14521493   else
14531494   {
r25468r25469
14791520
14801521READ8Z_MEMBER(ti99_paged_cartridge::readz)
14811522{
1482   if ((offset & GROM_MASK)==GROM_AREA)
1523   if ((offset & grom_mask())==grom_base())
14831524      gromreadz(space, offset, value, mem_mask);
14841525   else
14851526   {
r25468r25469
14971538WRITE8_MEMBER(ti99_paged_cartridge::write)
14981539{
14991540   // LOG("write standard\n");
1500   if ((offset & GROM_MASK)==GROM_AREA)
1541   if ((offset & grom_mask())==grom_base())
15011542      gromwrite(space, offset, data, mem_mask);
15021543
15031544   else {
r25468r25469
15151556/* Read function for the minimem cartridge. */
15161557READ8Z_MEMBER(ti99_minimem_cartridge::readz)
15171558{
1518   if ((offset & GROM_MASK)==GROM_AREA)
1559   if ((offset & grom_mask())==grom_base())
15191560      gromreadz(space, offset, value, mem_mask);
15201561
15211562   else
r25468r25469
15381579WRITE8_MEMBER(ti99_minimem_cartridge::write)
15391580{
15401581   // LOG("write standard\n");
1541   if ((offset & GROM_MASK)==GROM_AREA)
1582   if ((offset & grom_mask())==grom_base())
15421583      gromwrite(space, offset, data, mem_mask);
15431584
15441585   else
r25468r25469
15731614/* Read function for the super cartridge. */
15741615READ8Z_MEMBER(ti99_super_cartridge::readz)
15751616{
1576   if ((offset & GROM_MASK)==GROM_AREA)
1617   if ((offset & grom_mask())==grom_base())
15771618      gromreadz(space, offset, value, mem_mask);
15781619   else
15791620   {
r25468r25469
15871628/* Write function for the super cartridge. */
15881629WRITE8_MEMBER(ti99_super_cartridge::write)
15891630{
1590   if ((offset & GROM_MASK)==GROM_AREA)
1631   if ((offset & grom_mask())==grom_base())
15911632      gromwrite(space, offset, data, mem_mask);
15921633   else
15931634   {
r25468r25469
16581699/* Read function for the mbx cartridge. */
16591700READ8Z_MEMBER(ti99_mbx_cartridge::readz)
16601701{
1661   if ((offset & GROM_MASK)==GROM_AREA)
1702   if ((offset & grom_mask())==grom_base())
16621703      gromreadz(space, offset, value, mem_mask);
16631704   else
16641705   {
r25468r25469
16811722/* Write function for the mbx cartridge. */
16821723WRITE8_MEMBER(ti99_mbx_cartridge::write)
16831724{
1684   if ((offset & GROM_MASK)==GROM_AREA)
1725   if ((offset & grom_mask())==grom_base())
16851726      gromwrite(space, offset, data, mem_mask);
16861727   else
16871728   {
r25468r25469
18711912
18721913READ8Z_MEMBER(ti99_gromemu_cartridge::readz)
18731914{
1874   if ((offset & GROM_MASK)==GROM_AREA)
1915   if ((offset & grom_mask())==grom_base())
18751916      gromemureadz(space, offset, value, mem_mask);
18761917   else
18771918   {
r25468r25469
19001941WRITE8_MEMBER(ti99_gromemu_cartridge::write)
19011942{
19021943   // LOG("write standard\n");
1903   if ((offset & GROM_MASK)==GROM_AREA)
1944   if ((offset & grom_mask())==grom_base())
19041945      gromemuwrite(space, offset, data, mem_mask);
19051946
19061947   else {
trunk/src/mess/machine/ti99/gromport.h
r25468r25469
3737   DECLARE_WRITE_LINE_MEMBER(ready_line);
3838
3939   void    cartridge_inserted();
40   void    set_grom_base(UINT16 grombase, UINT16 grommask);
41   UINT16  get_grom_base() { return m_grombase; }
42   UINT16  get_grom_mask() { return m_grommask; }
4043
4144protected:
4245   virtual void device_start();
r25468r25469
4952   bool m_reset_on_insert;
5053   devcb_resolved_write_line m_console_reset;
5154   devcb_resolved_write_line m_console_ready;
55   UINT16      m_grombase;
56   UINT16      m_grommask;
5257};
5358
5459SLOT_INTERFACE_EXTERN(gromport);
r25468r25469
7277   DECLARE_WRITE8_MEMBER(write);
7378   void    crureadz(offs_t offset, UINT8 *value);
7479   void    cruwrite(offs_t offset, UINT8 data);
80
7581   void    ready_line(int state);
7682   bool    is_available() { return m_pcb != NULL; }
7783   bool    has_grom();
7884   void    set_slot(int i);
85   UINT16  grom_base();
86   UINT16  grom_mask();
7987
8088protected:
8189   virtual void device_start() { };
r25468r25469
126134   virtual DECLARE_WRITE8_MEMBER(write) =0;
127135   virtual void crureadz(offs_t offset, UINT8 *value) =0;
128136   virtual void cruwrite(offs_t offset, UINT8 data) =0;
137
129138   void ready_line(int state);
130139
131140   virtual void insert(int index, ti99_cartridge_device* cart) { m_gromport->cartridge_inserted(); };
132141   virtual void remove(int index) { };
142   UINT16 grom_base();
143   UINT16 grom_mask();
133144
134145protected:
135146   ti99_cartridge_connector_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
147   virtual void device_config_complete();
148
136149   gromport_device*    m_gromport;
137150};
138151
r25468r25469
150163   void cruwrite(offs_t offset, UINT8 data);
151164
152165protected:
153   virtual void device_start() { };
166   virtual void device_start();
154167   virtual void device_reset();
155168   virtual machine_config_constructor device_mconfig_additions() const;
156   virtual void device_config_complete();
157169
158170private:
159171   ti99_cartridge_device *m_cartridge;
r25468r25469
266278   DECLARE_READ8Z_MEMBER(gromreadz);
267279   DECLARE_WRITE8_MEMBER(gromwrite);
268280   inline void         set_grom_pointer(int number, device_t *dev);
281   void                set_cartridge(ti99_cartridge_device *cart);
282   UINT16              grom_base();
283   UINT16              grom_mask();
269284
285   ti99_cartridge_device*  m_cart;
270286   ti99_grom_device*   m_grom[5];
271287   int                 m_grom_size;
272288   int                 m_rom_size;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team