Previous 199869 Revisions Next

r20814 Thursday 7th February, 2013 at 20:55:30 UTC by Wilbert Pol
(MESS) Cleaned up tagmap usage in the spectrum drivers a bit. (nw)
[src/mess/drivers]atm.c elwro800.c pentagon.c scorpion.c spec128.c specpls3.c spectrum.c timex.c
[src/mess/formats]spec_snqk.c
[src/mess/includes]spectrum.h
[src/mess/video]spectrum.c

trunk/src/mess/formats/spec_snqk.c
r20813r20814
8686   if (state->m_port_7ffd_data == -1)
8787      return;
8888   if (state->m_port_1ffd_data == -1)
89      spectrum_128_update_memory(machine);
89      state->spectrum_128_update_memory();
9090
9191   else
9292   {
r20813r20814
9595         state->m_port_1ffd_data = 0x04;
9696      else
9797         state->m_port_1ffd_data = 0x00;
98      spectrum_plus3_update_memory(machine);
98      state->spectrum_plus3_update_memory();
9999   }
100100}
101101
r20813r20814
24402440      {
24412441         state->m_port_f4_data = 0x03;
24422442         state->m_port_ff_data = 0x00;
2443         ts2068_update_memory(machine);
2443         state->ts2068_update_memory();
24442444      }
24452445      if (z80_type == SPECTRUM_Z80_SNAPSHOT_TS2068 && !strcmp(machine.system().name,"ts2068"))
24462446      {
24472447         state->m_port_f4_data = snapdata[35];
24482448         state->m_port_ff_data = snapdata[36];
2449         ts2068_update_memory(machine);
2449         state->ts2068_update_memory();
24502450      }
24512451   }
24522452}
trunk/src/mess/drivers/pentagon.c
r20813r20814
1414public:
1515   pentagon_state(const machine_config &mconfig, device_type type, const char *tag)
1616      : spectrum_state(mconfig, type, tag)
17      , m_maincpu(*this, "maincpu")
1817      , m_bank1(*this, "bank1")
1918      , m_bank2(*this, "bank2")
2019      , m_bank3(*this, "bank3")
2120      , m_bank4(*this, "bank4")
2221      , m_beta(*this, BETA_DISK_TAG)
23      , m_ram(*this, RAM_TAG)
2422   { }
2523
2624   DECLARE_DIRECT_UPDATE_MEMBER(pentagon_direct);
r20813r20814
2826   DECLARE_MACHINE_RESET(pentagon);
2927
3028protected:
31   required_device<cpu_device> m_maincpu;
3229   required_memory_bank m_bank1;
3330   required_memory_bank m_bank2;
3431   required_memory_bank m_bank3;
3532   required_memory_bank m_bank4;
3633   required_device<device_t> m_beta;
37   required_device<ram_device> m_ram;
3834private:
3935   UINT8 *m_p_ram;
4036   void pentagon_update_memory();
trunk/src/mess/drivers/specpls3.c
r20813r20814
172172      4,7,6,3
173173};
174174
175static WRITE8_HANDLER(spectrum_plus3_port_3ffd_w)
175WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_w )
176176{
177   spectrum_state *state = space.machine().driver_data<spectrum_state>();
178   if (state->m_floppy==1)
179      space.machine().device<upd765a_device>("upd765")->fifo_w(space, 0, data, 0xff);
177   if (m_floppy==1)
178      m_upd765->fifo_w(space, 0, data, 0xff);
180179}
181180
182static  READ8_HANDLER(spectrum_plus3_port_3ffd_r)
181READ8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_r )
183182{
184   spectrum_state *state = space.machine().driver_data<spectrum_state>();
185   if (state->m_floppy==0)
183   if (m_floppy==0)
186184      return 0xff;
187185   else
188      return space.machine().device<upd765a_device>("upd765")->fifo_r(space, 0, 0xff);
186      return m_upd765->fifo_r(space, 0, 0xff);
189187}
190188
191189
192static  READ8_HANDLER(spectrum_plus3_port_2ffd_r)
190READ8_MEMBER( spectrum_state::spectrum_plus3_port_2ffd_r )
193191{
194   spectrum_state *state = space.machine().driver_data<spectrum_state>();
195   if (state->m_floppy==0)
192   if (m_floppy==0)
196193      return 0xff;
197194   else
198      return space.machine().device<upd765a_device>("upd765")->msr_r(space, 0, 0xff);
195      return m_upd765->msr_r(space, 0, 0xff);
199196}
200197
201198
202void spectrum_plus3_update_memory(running_machine &machine)
199void spectrum_state::spectrum_plus3_update_memory()
203200{
204   spectrum_state *state = machine.driver_data<spectrum_state>();
205   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
206   UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer();
201   address_space &space = m_maincpu->space(AS_PROGRAM);
202   UINT8 *messram = m_ram->pointer();
207203
208   if (state->m_port_7ffd_data & 8)
204   if (m_port_7ffd_data & 8)
209205   {
210206      logerror("+3 SCREEN 1: BLOCK 7\n");
211      state->m_screen_location = messram + (7 << 14);
207      m_screen_location = messram + (7 << 14);
212208   }
213209   else
214210   {
215211      logerror("+3 SCREEN 0: BLOCK 5\n");
216      state->m_screen_location = messram + (5 << 14);
212      m_screen_location = messram + (5 << 14);
217213   }
218214
219   if ((state->m_port_1ffd_data & 0x01) == 0)
215   if ((m_port_1ffd_data & 0x01) == 0)
220216   {
221217         int ram_page;
222218         unsigned char *ram_data;
r20813r20814
226222         int ROMSelection;
227223
228224         /* select ram at 0x0c000-0x0ffff */
229         ram_page = state->m_port_7ffd_data & 0x07;
225         ram_page = m_port_7ffd_data & 0x07;
230226         ram_data = messram + (ram_page<<14);
231227
232         state->membank("bank4")->set_base(ram_data);
228         membank("bank4")->set_base(ram_data);
233229
234230         logerror("RAM at 0xc000: %02x\n", ram_page);
235231
236232         /* Reset memory between 0x4000 - 0xbfff in case extended paging was being used */
237233         /* Bank 5 in 0x4000 - 0x7fff */
238         state->membank("bank2")->set_base(messram + (5 << 14));
234         membank("bank2")->set_base(messram + (5 << 14));
239235
240236         /* Bank 2 in 0x8000 - 0xbfff */
241         state->membank("bank3")->set_base(messram + (2 << 14));
237         membank("bank3")->set_base(messram + (2 << 14));
242238
243239
244         ROMSelection = ((state->m_port_7ffd_data >> 4) & 0x01) |
245            ((state->m_port_1ffd_data >> 1) & 0x02);
240         ROMSelection = ((m_port_7ffd_data >> 4) & 0x01) |
241            ((m_port_1ffd_data >> 1) & 0x02);
246242
247243         /* rom 0 is editor, rom 1 is syntax, rom 2 is DOS, rom 3 is 48 BASIC */
248244
249         ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x010000 + (ROMSelection << 14);
245         ChosenROM = memregion("maincpu")->base() + 0x010000 + (ROMSelection << 14);
250246
251         state->membank("bank1")->set_base(ChosenROM);
247         membank("bank1")->set_base(ChosenROM);
252248         space.unmap_write(0x0000, 0x3fff);
253249
254250         logerror("rom switch: %02x\n", ROMSelection);
r20813r20814
261257         int MemorySelection;
262258         unsigned char *ram_data;
263259
264         MemorySelection = (state->m_port_1ffd_data >> 1) & 0x03;
260         MemorySelection = (m_port_1ffd_data >> 1) & 0x03;
265261
266262         memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)];
267263
268264         ram_data = messram + (memory_selection[0] << 14);
269         state->membank("bank1")->set_base(ram_data);
265         membank("bank1")->set_base(ram_data);
270266         /* allow writes to 0x0000-0x03fff */
271267         space.install_write_bank(0x0000, 0x3fff, "bank1");
272268
273269         ram_data = messram + (memory_selection[1] << 14);
274         state->membank("bank2")->set_base(ram_data);
270         membank("bank2")->set_base(ram_data);
275271
276272         ram_data = messram + (memory_selection[2] << 14);
277         state->membank("bank3")->set_base(ram_data);
273         membank("bank3")->set_base(ram_data);
278274
279275         ram_data = messram + (memory_selection[3] << 14);
280         state->membank("bank4")->set_base(ram_data);
276         membank("bank4")->set_base(ram_data);
281277
282278         logerror("extended memory paging: %02x\n", MemorySelection);
283279   }
r20813r20814
285281
286282
287283
288static WRITE8_HANDLER(spectrum_plus3_port_7ffd_w)
284WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_7ffd_w )
289285{
290286      /* D0-D2: RAM page located at 0x0c000-0x0ffff */
291287      /* D3 - Screen select (screen 0 in ram page 5, screen 1 in ram page 7 */
292288      /* D4 - ROM select - which rom paged into 0x0000-0x03fff */
293289      /* D5 - Disable paging */
294290
295   spectrum_state *state = space.machine().driver_data<spectrum_state>();
296
297291   /* disable paging? */
298   if (state->m_port_7ffd_data & 0x20)
292   if (m_port_7ffd_data & 0x20)
299293      return;
300294
301295   /* store new state */
302   state->m_port_7ffd_data = data;
296   m_port_7ffd_data = data;
303297
304298   /* update memory */
305   spectrum_plus3_update_memory(space.machine());
299   spectrum_plus3_update_memory();
306300}
307301
308static WRITE8_HANDLER(spectrum_plus3_port_1ffd_w)
302WRITE8_HANDLER( spectrum_state::spectrum_plus3_port_1ffd_w )
309303{
310304   /* D0-D1: ROM/RAM paging */
311305   /* D2: Affects if d0-d1 work on ram/rom */
312306   /* D3 - Disk motor on/off */
313307   /* D4 - parallel port strobe */
314308
315   spectrum_state *state = space.machine().driver_data<spectrum_state>();
309   m_upd765_0->get_device()->mon_w(!BIT(data, 3));
310   m_upd765_1->get_device()->mon_w(!BIT(data, 3));
316311
317   space.machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!BIT(data, 3));
318   space.machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!BIT(data, 3));
312   m_port_1ffd_data = data;
319313
320   state->m_port_1ffd_data = data;
321
322314   /* disable paging? */
323   if ((state->m_port_7ffd_data & 0x20)==0)
315   if ((m_port_7ffd_data & 0x20)==0)
324316   {
325317         /* no */
326         spectrum_plus3_update_memory(space.machine());
318         spectrum_plus3_update_memory();
327319   }
328320}
329321
r20813r20814
333325   ADDRESS_MAP_UNMAP_HIGH
334326   AM_RANGE(0x0000, 0x0000) AM_READWRITE(spectrum_port_fe_r,spectrum_port_fe_w) AM_MIRROR(0xfffe) AM_MASK(0xffff)
335327   AM_RANGE(0x001f, 0x001f) AM_READ(spectrum_port_1f_r) AM_MIRROR(0xff00)
336   AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(spectrum_plus3_port_7ffd_w) AM_MIRROR(0x3ffd)
328   AM_RANGE(0x4000, 0x4000) AM_WRITE(spectrum_plus3_port_7ffd_w) AM_MIRROR(0x3ffd)
337329   AM_RANGE(0x8000, 0x8000) AM_DEVWRITE_LEGACY("ay8912", ay8910_data_w) AM_MIRROR(0x3ffd)
338330   AM_RANGE(0xc000, 0xc000) AM_DEVREADWRITE_LEGACY("ay8912", ay8910_r, ay8910_address_w) AM_MIRROR(0x3ffd)
339   AM_RANGE(0x1000, 0x1000) AM_WRITE_LEGACY(spectrum_plus3_port_1ffd_w) AM_MIRROR(0x0ffd)
340   AM_RANGE(0x2000, 0x2000) AM_READ_LEGACY(spectrum_plus3_port_2ffd_r) AM_MIRROR(0x0ffd)
341   AM_RANGE(0x3000, 0x3000) AM_READWRITE_LEGACY(spectrum_plus3_port_3ffd_r,spectrum_plus3_port_3ffd_w) AM_MIRROR(0x0ffd)
331   AM_RANGE(0x1000, 0x1000) AM_WRITE(spectrum_plus3_port_1ffd_w) AM_MIRROR(0x0ffd)
332   AM_RANGE(0x2000, 0x2000) AM_READ(spectrum_plus3_port_2ffd_r) AM_MIRROR(0x0ffd)
333   AM_RANGE(0x3000, 0x3000) AM_READWRITE(spectrum_plus3_port_3ffd_r,spectrum_plus3_port_3ffd_w) AM_MIRROR(0x0ffd)
342334ADDRESS_MAP_END
343335
344336MACHINE_RESET_MEMBER(spectrum_state,spectrum_plus3)
345337{
346   UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer();
338   UINT8 *messram = m_ram->pointer();
347339   memset(messram,0,128*1024);
348340
349341   MACHINE_RESET_CALL_MEMBER(spectrum);
r20813r20814
351343   /* Initial configuration */
352344   m_port_7ffd_data = 0;
353345   m_port_1ffd_data = 0;
354   spectrum_plus3_update_memory(machine());
346   spectrum_plus3_update_memory();
355347}
356348
357349DRIVER_INIT_MEMBER(spectrum_state,plus3)
trunk/src/mess/drivers/spectrum.c
r20813r20814
275275
276276#include "emu.h"
277277#include "cpu/z80/z80.h"
278#include "sound/speaker.h"
279278#include "sound/wave.h"
280279#include "includes/spectrum.h"
281#include "imagedev/snapquik.h"
282#include "imagedev/cartslot.h"
283#include "imagedev/cassette.h"
284#include "machine/ram.h"
285280#include "formats/tzx_cas.h"
286281#include "formats/spec_snqk.h"
287282
r20813r20814
298293
299294WRITE8_MEMBER(spectrum_state::spectrum_port_fe_w)
300295{
301   device_t *speaker = machine().device(SPEAKER_TAG);
302296   unsigned char Changed;
303297
304298   Changed = m_port_fe_data^data;
r20813r20814
306300   /* border colour changed? */
307301   if ((Changed & 0x07)!=0)
308302   {
309      spectrum_UpdateBorderBitmap(machine());
303      spectrum_UpdateBorderBitmap();
310304   }
311305
312306   if ((Changed & (1<<4))!=0)
313307   {
314308      /* DAC output state */
315      speaker_level_w(speaker,(data>>4) & 0x01);
309      speaker_level_w(m_speaker,(data>>4) & 0x01);
316310   }
317311
318312   if ((Changed & (1<<3))!=0)
319313   {
320314      /* write cassette data */
321      machine().device<cassette_image_device>(CASSETTE_TAG)->output((data & (1<<3)) ? -1.0 : +1.0);
315      m_cassette->output((data & (1<<3)) ? -1.0 : +1.0);
322316   }
323317
324318   m_port_fe_data = data;
r20813r20814
333327   int lines = offset >> 8;
334328   int data = 0xff;
335329
336   int cs_extra1 = ioport("PLUS0")->read_safe(0xff) & 0x1f;
337   int cs_extra2 = ioport("PLUS1")->read_safe(0xff) & 0x1f;
338   int cs_extra3 = ioport("PLUS2")->read_safe(0xff) & 0x1f;
339   int ss_extra1 = ioport("PLUS3")->read_safe(0xff) & 0x1f;
340   int ss_extra2 = ioport("PLUS4")->read_safe(0xff) & 0x1f;
330   int cs_extra1 = m_io_plus0 ? m_io_plus0->read() & 0x1f : 0x1f;
331   int cs_extra2 = m_io_plus1 ? m_io_plus1->read() & 0x1f : 0x1f;
332   int cs_extra3 = m_io_plus2 ? m_io_plus2->read() & 0x1f : 0x1f;
333   int ss_extra1 = m_io_plus3 ? m_io_plus3->read() & 0x1f : 0x1f;
334   int ss_extra2 = m_io_plus4 ? m_io_plus4->read() & 0x1f : 0x1f;
341335
342336   /* Caps - V */
343337   if ((lines & 1) == 0)
344338   {
345      data &= ioport("LINE0")->read();
339      data &= m_io_line0->read();
346340      /* CAPS for extra keys */
347341      if (cs_extra1 != 0x1f || cs_extra2 != 0x1f || cs_extra3 != 0x1f)
348342         data &= ~0x01;
r20813r20814
350344
351345   /* A - G */
352346   if ((lines & 2) == 0)
353      data &= ioport("LINE1")->read();
347      data &= m_io_line1->read();
354348
355349   /* Q - T */
356350   if ((lines & 4) == 0)
357      data &= ioport("LINE2")->read();
351      data &= m_io_line2->read();
358352
359353   /* 1 - 5 */
360354   if ((lines & 8) == 0)
361      data &= ioport("LINE3")->read() & cs_extra1;
355      data &= m_io_line3->read() & cs_extra1;
362356
363357   /* 6 - 0 */
364358   if ((lines & 16) == 0)
365      data &= ioport("LINE4")->read() & cs_extra2;
359      data &= m_io_line4->read() & cs_extra2;
366360
367361   /* Y - P */
368362   if ((lines & 32) == 0)
369      data &= ioport("LINE5")->read() & ss_extra1;
363      data &= m_io_line5->read() & ss_extra1;
370364
371365   /* H - Enter */
372366   if ((lines & 64) == 0)
373      data &= ioport("LINE6")->read();
367      data &= m_io_line6->read();
374368
375369      /* B - Space */
376370   if ((lines & 128) == 0)
377371   {
378      data &= ioport("LINE7")->read() & cs_extra3 & ss_extra2;
372      data &= m_io_line7->read() & cs_extra3 & ss_extra2;
379373      /* SYMBOL SHIFT for extra keys */
380374      if (ss_extra1 != 0x1f || ss_extra2 != 0x1f)
381375         data &= ~0x02;
r20813r20814
384378   data |= (0xe0); /* Set bits 5-7 - as reset above */
385379
386380   /* cassette input from wav */
387   if ((machine().device<cassette_image_device>(CASSETTE_TAG))->input() > 0.0038 )
381   if (m_cassette->input() > 0.0038 )
388382   {
389383      data &= ~0x40;
390384   }
391385
392386   /* Issue 2 Spectrums default to having bits 5, 6 & 7 set.
393387   Issue 3 Spectrums default to having bits 5 & 7 set and bit 6 reset. */
394   if (ioport("CONFIG")->read() & 0x80)
388   if (m_io_config->read() & 0x80)
395389      data ^= (0x40);
396390
397391   return data;
r20813r20814
400394/* kempston joystick interface */
401395READ8_MEMBER(spectrum_state::spectrum_port_1f_r)
402396{
403   return ioport("KEMPSTON")->read() & 0x1f;
397   return m_io_kempston->read() & 0x1f;
404398}
405399
406400/* fuller joystick interface */
407401READ8_MEMBER(spectrum_state::spectrum_port_7f_r)
408402{
409   return ioport("FULLER")->read() | (0xff^0x8f);
403   return m_io_fuller->read() | (0xff^0x8f);
410404}
411405
412406/* mikrogen joystick interface */
413407READ8_MEMBER(spectrum_state::spectrum_port_df_r)
414408{
415   return ioport("MIKROGEN")->read() | (0xff^0x1f);
409   return m_io_mikrogen->read() | (0xff^0x1f);
416410}
417411
418412READ8_MEMBER(spectrum_state::spectrum_port_ula_r)
r20813r20814
613607
614608DRIVER_INIT_MEMBER(spectrum_state,spectrum)
615609{
616   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
610   address_space &space = m_maincpu->space(AS_PROGRAM);
617611
618   switch (machine().device<ram_device>(RAM_TAG)->size())
612   switch (m_ram->size())
619613   {
620614      case 48*1024:
621615      space.install_ram(0x8000, 0xffff, NULL); // Fall through
r20813r20814
677671         return IMAGE_INIT_FAIL;
678672      }
679673
680      if (image.fread(image.device().machine().root_device().memregion("maincpu")->base(), filesize) != filesize)
674      if (image.fread(memregion("maincpu")->base(), filesize) != filesize)
681675      {
682676         image.seterror(IMAGE_ERROR_UNSPECIFIED, "Error loading file");
683677         return IMAGE_INIT_FAIL;
r20813r20814
686680   else
687681   {
688682      filesize = image.get_software_region_length("rom");
689      memcpy(image.device().machine().root_device().memregion("maincpu")->base(), image.get_software_region("rom"), filesize);
683      memcpy(memregion("maincpu")->base(), image.get_software_region("rom"), filesize);
690684   }
691685   return IMAGE_INIT_PASS;
692686}
trunk/src/mess/drivers/atm.c
r20813r20814
2626public:
2727   atm_state(const machine_config &mconfig, device_type type, const char *tag)
2828      : spectrum_state(mconfig, type, tag)
29      , m_maincpu(*this, "maincpu")
3029      , m_bank1(*this, "bank1")
3130      , m_bank2(*this, "bank2")
3231      , m_bank3(*this, "bank3")
3332      , m_bank4(*this, "bank4")
3433      , m_beta(*this, BETA_DISK_TAG)
35      , m_ram(*this, RAM_TAG)
3634   { }
3735
3836   DECLARE_WRITE8_MEMBER(atm_port_7ffd_w);
3937   DIRECT_UPDATE_MEMBER(atm_direct);
4038   DECLARE_MACHINE_RESET(atm);
39
4140protected:
42   required_device<cpu_device> m_maincpu;
4341   required_memory_bank m_bank1;
4442   required_memory_bank m_bank2;
4543   required_memory_bank m_bank3;
4644   required_memory_bank m_bank4;
4745   required_device<device_t> m_beta;
48   required_device<ram_device> m_ram;
46
4947private:
5048   UINT8 *m_p_ram;
5149   void atm_update_memory();
trunk/src/mess/drivers/spec128.c
r20813r20814
169169/****************************************************************************************************/
170170/* Spectrum 128 specific functions */
171171
172static WRITE8_HANDLER(spectrum_128_port_7ffd_w)
172WRITE8_MEMBER(spectrum_state::spectrum_128_port_7ffd_w)
173173{
174   spectrum_state *state = space.machine().driver_data<spectrum_state>();
175
176174   /* D0-D2: RAM page located at 0x0c000-0x0ffff */
177175   /* D3 - Screen select (screen 0 in ram page 5, screen 1 in ram page 7 */
178176   /* D4 - ROM select - which rom paged into 0x0000-0x03fff */
179177   /* D5 - Disable paging */
180178
181179   /* disable paging? */
182   if (state->m_port_7ffd_data & 0x20)
180   if (m_port_7ffd_data & 0x20)
183181         return;
184182
185183   /* store new state */
186   state->m_port_7ffd_data = data;
184   m_port_7ffd_data = data;
187185
188186   /* update memory */
189   spectrum_128_update_memory(space.machine());
187   spectrum_128_update_memory();
190188}
191189
192void spectrum_128_update_memory(running_machine &machine)
190void spectrum_state::spectrum_128_update_memory()
193191{
194   spectrum_state *state = machine.driver_data<spectrum_state>();
195   UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer();
192   UINT8 *messram = m_ram->pointer();
196193   unsigned char *ChosenROM;
197194   int ROMSelection;
198195
199   if (state->m_port_7ffd_data & 8)
196   if (m_port_7ffd_data & 8)
200197   {
201      state->m_screen_location = messram + (7<<14);
198      m_screen_location = messram + (7<<14);
202199   }
203200   else
204201   {
205      state->m_screen_location = messram + (5<<14);
202      m_screen_location = messram + (5<<14);
206203   }
207204
208205   /* select ram at 0x0c000-0x0ffff */
r20813r20814
210207      int ram_page;
211208      unsigned char *ram_data;
212209
213      ram_page = state->m_port_7ffd_data & 0x07;
210      ram_page = m_port_7ffd_data & 0x07;
214211      ram_data = messram + (ram_page<<14);
215212
216      state->membank("bank4")->set_base(ram_data);
213      membank("bank4")->set_base(ram_data);
217214   }
218215
219216   /* ROM switching */
220   ROMSelection = ((state->m_port_7ffd_data>>4) & 0x01);
217   ROMSelection = ((m_port_7ffd_data>>4) & 0x01);
221218
222219   /* rom 0 is 128K rom, rom 1 is 48 BASIC */
223220
224   ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x010000 + (ROMSelection<<14);
221   ChosenROM = memregion("maincpu")->base() + 0x010000 + (ROMSelection<<14);
225222
226   state->membank("bank1")->set_base(ChosenROM);
223   membank("bank1")->set_base(ChosenROM);
227224}
228225
229static  READ8_HANDLER ( spectrum_128_ula_r )
226READ8_MEMBER( spectrum_state::spectrum_128_ula_r )
230227{
231   spectrum_state *state = space.machine().driver_data<spectrum_state>();
232   int vpos = space.machine().primary_screen->vpos();
228   int vpos = machine().primary_screen->vpos();
233229
234   return vpos<193 ? state->m_screen_location[0x1800|(vpos&0xf8)<<2]:0xff;
230   return vpos<193 ? m_screen_location[0x1800|(vpos&0xf8)<<2]:0xff;
235231}
236232
237233static ADDRESS_MAP_START (spectrum_128_io, AS_IO, 8, spectrum_state )
r20813r20814
239235   AM_RANGE(0x001f, 0x001f) AM_READ(spectrum_port_1f_r) AM_MIRROR(0xff00)
240236   AM_RANGE(0x007f, 0x007f) AM_READ(spectrum_port_7f_r) AM_MIRROR(0xff00)
241237   AM_RANGE(0x00df, 0x00df) AM_READ(spectrum_port_df_r) AM_MIRROR(0xff00)
242   AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(spectrum_128_port_7ffd_w) AM_MIRROR(0x3ffd)
238   AM_RANGE(0x4000, 0x4000) AM_WRITE(spectrum_128_port_7ffd_w) AM_MIRROR(0x3ffd)
243239   AM_RANGE(0x8000, 0x8000) AM_DEVWRITE_LEGACY("ay8912", ay8910_data_w) AM_MIRROR(0x3ffd)
244240   AM_RANGE(0xc000, 0xc000) AM_DEVREADWRITE_LEGACY("ay8912", ay8910_r, ay8910_address_w) AM_MIRROR(0x3ffd)
245   AM_RANGE(0x0001, 0x0001) AM_READ_LEGACY(spectrum_128_ula_r) AM_MIRROR(0xfffe)
241   AM_RANGE(0x0001, 0x0001) AM_READ(spectrum_128_ula_r) AM_MIRROR(0xfffe)
246242ADDRESS_MAP_END
247243
248244static ADDRESS_MAP_START (spectrum_128_mem, AS_PROGRAM, 8, spectrum_state )
r20813r20814
254250
255251MACHINE_RESET_MEMBER(spectrum_state,spectrum_128)
256252{
257   UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer();
253   UINT8 *messram = m_ram->pointer();
258254
259255   memset(messram,0,128*1024);
260256   /* 0x0000-0x3fff always holds ROM */
r20813r20814
270266   /* set initial ram config */
271267   m_port_7ffd_data = 0;
272268   m_port_1ffd_data = -1;
273   spectrum_128_update_memory(machine());
269   spectrum_128_update_memory();
274270}
275271
276272/* F4 Character Displayer */
trunk/src/mess/drivers/elwro800.c
r20813r20814
3434{
3535public:
3636   elwro800_state(const machine_config &mconfig, device_type type, const char *tag)
37      : spectrum_state(mconfig, type, tag) { }
37      : spectrum_state(mconfig, type, tag)
38      , m_i8251(*this, "i8251")
39      , m_i8255(*this, "ppi8255")
40      , m_centronics(*this, "centronics")
41      , m_io_line8(*this, "LINE8")
42      , m_io_line9(*this, "LINE9")
43      , m_io_network_id(*this, "NETWORK ID")
44   { }
3845
3946   /* for elwro800 */
4047   /* RAM mapped at 0 */
r20813r20814
5259   INTERRUPT_GEN_MEMBER(elwro800jr_interrupt);
5360   DECLARE_READ8_MEMBER(i8255_port_c_r);
5461   DECLARE_WRITE8_MEMBER(i8255_port_c_w);
62
63protected:
64   required_device<i8251_device> m_i8251;
65   required_device<i8255_device> m_i8255;
66   required_device<centronics_device> m_centronics;
67   required_ioport m_io_line8;
68   required_ioport m_io_line9;
69   required_ioport m_io_network_id;
70
71   void elwro800jr_mmu_w(UINT8 data);
5572};
5673
5774
r20813r20814
8097
8198WRITE8_MEMBER(elwro800_state::elwro800jr_fdc_control_w)
8299{
83   upd765a_device *fdc = machine().device<upd765a_device>("upd765");
100   m_upd765_0->get_device()->mon_w(!BIT(data, 0));
101   m_upd765_1->get_device()->mon_w(!BIT(data, 1));
84102
85   machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!BIT(data, 0));
86   machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!BIT(data, 1));
103   m_upd765->tc_w(data & 0x04);
87104
88   fdc->tc_w(data & 0x04);
89
90105   if(!(data & 8))
91      fdc->reset();
106      m_upd765->reset();
92107}
93108
94109/*************************************
r20813r20814
97112 *
98113 *************************************/
99114
100static void elwro800jr_mmu_w(running_machine &machine, UINT8 data)
115void elwro800_state::elwro800jr_mmu_w(UINT8 data)
101116{
102   UINT8 *prom = machine.root_device().memregion("proms")->base() + 0x200;
103   UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer();
117   UINT8 *prom = memregion("proms")->base() + 0x200;
118   UINT8 *messram = m_ram->pointer();
104119   UINT8 cs;
105120   UINT8 ls175;
106   elwro800_state *state = machine.driver_data<elwro800_state>();
107121
108122   ls175 = BITSWAP8(data, 7, 6, 5, 4, 4, 5, 7, 6) & 0x0f;
109123
r20813r20814
111125   if (!BIT(cs,0))
112126   {
113127      // rom BAS0
114      state->membank("bank1")->set_base(state->memregion("maincpu")->base() + 0x0000); /* BAS0 ROM */
115      machine.device("maincpu")->memory().space(AS_PROGRAM).nop_write(0x0000, 0x1fff);
116      state->m_ram_at_0000 = 0;
128      membank("bank1")->set_base(memregion("maincpu")->base() + 0x0000); /* BAS0 ROM */
129      m_maincpu->space(AS_PROGRAM).nop_write(0x0000, 0x1fff);
130      m_ram_at_0000 = 0;
117131   }
118132   else if (!BIT(cs,4))
119133   {
120134      // rom BOOT
121      state->membank("bank1")->set_base(machine.root_device().memregion("maincpu")->base() + 0x4000); /* BOOT ROM */
122      machine.device("maincpu")->memory().space(AS_PROGRAM).nop_write(0x0000, 0x1fff);
123      state->m_ram_at_0000 = 0;
135      membank("bank1")->set_base(memregion("maincpu")->base() + 0x4000); /* BOOT ROM */
136      m_maincpu->space(AS_PROGRAM).nop_write(0x0000, 0x1fff);
137      m_ram_at_0000 = 0;
124138   }
125139   else
126140   {
127141      // RAM
128      state->membank("bank1")->set_base(messram);
129      machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_bank(0x0000, 0x1fff, "bank1");
130      state->m_ram_at_0000 = 1;
142      membank("bank1")->set_base(messram);
143      m_maincpu->space(AS_PROGRAM).install_write_bank(0x0000, 0x1fff, "bank1");
144      m_ram_at_0000 = 1;
131145   }
132146
133147   cs = prom[((0x2000 >> 10) | (ls175 << 6)) & 0x1ff];
134148   if (!BIT(cs,1))
135149   {
136      state->membank("bank2")->set_base(machine.root_device().memregion("maincpu")->base() + 0x2000); /* BAS1 ROM */
137      machine.device("maincpu")->memory().space(AS_PROGRAM).nop_write(0x2000, 0x3fff);
150      membank("bank2")->set_base(memregion("maincpu")->base() + 0x2000); /* BAS1 ROM */
151      m_maincpu->space(AS_PROGRAM).nop_write(0x2000, 0x3fff);
138152   }
139153   else
140154   {
141      state->membank("bank2")->set_base(messram + 0x2000); /* RAM */
142      machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_bank(0x2000, 0x3fff, "bank2");
155      membank("bank2")->set_base(messram + 0x2000); /* RAM */
156      m_maincpu->space(AS_PROGRAM).install_write_bank(0x2000, 0x3fff, "bank2");
143157   }
144158
145159   if (BIT(ls175,2))
146160   {
147161      // relok
148      state->m_screen_location = messram + 0xe000;
162      m_screen_location = messram + 0xe000;
149163   }
150164   else
151165   {
152      state->m_screen_location = messram + 0x4000;
166      m_screen_location = messram + 0x4000;
153167   }
154168
155   state->m_NR = BIT(ls175,3);
169   m_NR = BIT(ls175,3);
156170   if (BIT(ls175,3))
157171   {
158172      logerror("Reading network number\n");
r20813r20814
167181
168182READ8_MEMBER(elwro800_state::i8255_port_c_r)
169183{
170   centronics_device *centronics = machine().device<centronics_device>("centronics");
171   return (centronics->ack_r() << 2);
184   return (m_centronics->ack_r() << 2);
172185}
173186
174187WRITE8_MEMBER(elwro800_state::i8255_port_c_w)
175188{
176   centronics_device *centronics = machine().device<centronics_device>("centronics");
177   centronics->strobe_w((data >> 7) & 0x01);
189   m_centronics->strobe_w((data >> 7) & 0x01);
178190}
179191
180192static I8255_INTERFACE(elwro800jr_ppi8255_interface)
r20813r20814
227239      int mask = 0x8000;
228240      int data = 0xff;
229241      int i;
230      char port_name[6] = "LINE0";
242      ioport_port *io_ports[9] = { m_io_line7, m_io_line6, m_io_line5, m_io_line4, m_io_line3, m_io_line2, m_io_line1, m_io_line0, m_io_line8 };
231243
232244      if ( !m_NR )
233245      {
r20813r20814
235247         {
236248            if (!(offset & mask))
237249            {
238               if (i == 8)
239               {
240                  port_name[4] = '8';
241               }
242               else
243               {
244                  port_name[4] = '0' + (7 - i);
245               }
246               data &= (ioport(port_name)->read());
250               data &= io_ports[i]->read();
247251            }
248252         }
249253
250254         if ((offset & 0xff) == 0xfb)
251255         {
252            data &= ioport("LINE9")->read();
256            data &= m_io_line9->read();
253257         }
254258
255259         /* cassette input from wav */
256         if ((machine().device<cassette_image_device>(CASSETTE_TAG))->input() > 0.0038 )
260         if (m_cassette->input() > 0.0038 )
257261         {
258262            data &= ~0x40;
259263         }
260264      }
261265      else
262266      {
263         data = ioport("NETWORK ID")->read();
267         data = m_io_network_id->read();
264268      }
265269
266270      return data;
r20813r20814
272276   else if (!BIT(cs,2))
273277   {
274278      // CS55
275      i8255_device *ppi = machine().device<i8255_device>("ppi8255");
276      return ppi->read(space, (offset & 0x03) ^ 0x03);
279      return m_i8255->read(space, (offset & 0x03) ^ 0x03);
277280   }
278281   else if (!BIT(cs,3))
279282   {
280283      // CSFDC
281      upd765a_device *fdc = machine().device<upd765a_device>("upd765");
282284      if (offset & 1)
283285      {
284         return fdc->fifo_r(space, 0, 0xff);
286         return m_upd765->fifo_r(space, 0, 0xff);
285287      }
286288      else
287289      {
288         return fdc->msr_r(space, 0, 0xff);
290         return m_upd765->msr_r(space, 0, 0xff);
289291      }
290292   }
291293   else if (!BIT(cs,4))
292294   {
293295      // CS51
294      i8251_device *usart = machine().device<i8251_device>("i8251");
295296      if (offset & 1)
296297      {
297         return usart->status_r(space, 0);
298         return m_i8251->status_r(space, 0);
298299      }
299300      else
300301      {
301         return usart->data_r(space, 0);
302         return m_i8251->data_r(space, 0);
302303      }
303304   }
304305   else if (!BIT(cs,5))
r20813r20814
325326   else if (!BIT(cs,1))
326327   {
327328      // CF7
328      elwro800jr_mmu_w(machine(), data);
329      elwro800jr_mmu_w(data);
329330   }
330331   else if (!BIT(cs,2))
331332   {
332333      // CS55
333      i8255_device *ppi = machine().device<i8255_device>("ppi8255");
334      ppi->write(space, (offset & 0x03) ^ 0x03, data);
334      m_i8255->write(space, (offset & 0x03) ^ 0x03, data);
335335   }
336336   else if (!BIT(cs,3))
337337   {
338338      // CSFDC
339      upd765a_device *fdc = machine().device<upd765a_device>("upd765");
340339      if (offset & 1)
341340      {
342         fdc->fifo_w(space, 0, data, 0xff);
341         m_upd765->fifo_w(space, 0, data, 0xff);
343342      }
344343   }
345344   else if (!BIT(cs,4))
346345   {
347346      // CS51
348      i8251_device *usart = machine().device<i8251_device>("i8251");
349347      if (offset & 1)
350348      {
351         usart->control_w(space, 0, data);
349         m_i8251->control_w(space, 0, data);
352350      }
353351      else
354352      {
355         usart->data_w(space, 0, data);
353         m_i8251->data_w(space, 0, data);
356354      }
357355   }
358356   else if (!BIT(cs,5))
r20813r20814
502500
503501MACHINE_RESET_MEMBER(elwro800_state,elwro800)
504502{
505   UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer();
503   UINT8 *messram = m_ram->pointer();
506504
507505   m_df_on_databus = 0xdf;
508506   memset(messram, 0, 64*1024);
r20813r20814
513511   m_port_1ffd_data = -1;
514512
515513   // this is a reset of ls175 in mmu
516   elwro800jr_mmu_w(machine(), 0);
514   elwro800jr_mmu_w(0);
517515
518   machine().device("maincpu")->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(elwro800_state::elwro800_direct_handler), this));
516   m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(elwro800_state::elwro800_direct_handler), this));
519517}
520518
521519static const cassette_interface elwro800jr_cassette_interface =
trunk/src/mess/drivers/scorpion.c
r20813r20814
160160public:
161161   scorpion_state(const machine_config &mconfig, device_type type, const char *tag)
162162      : spectrum_state(mconfig, type, tag)
163      , m_maincpu(*this, "maincpu")
164163      , m_bank1(*this, "bank1")
165164      , m_bank2(*this, "bank2")
166165      , m_bank3(*this, "bank3")
167166      , m_bank4(*this, "bank4")
168167      , m_beta(*this, BETA_DISK_TAG)
169      , m_ram(*this, RAM_TAG)
170168   { }
171169
172170   DECLARE_DIRECT_UPDATE_MEMBER(scorpion_direct);
r20813r20814
177175   DECLARE_MACHINE_RESET(scorpion);
178176   TIMER_DEVICE_CALLBACK_MEMBER(nmi_check_callback);
179177protected:
180   required_device<cpu_device> m_maincpu;
181178   required_memory_bank m_bank1;
182179   required_memory_bank m_bank2;
183180   required_memory_bank m_bank3;
184181   required_memory_bank m_bank4;
185182   required_device<device_t> m_beta;
186   required_device<ram_device> m_ram;
187183private:
188184   UINT8 *m_p_ram;
189185   void scorpion_update_memory();
r20813r20814
288284
289285TIMER_DEVICE_CALLBACK_MEMBER(scorpion_state::nmi_check_callback)
290286{
291   if ((machine().root_device().ioport("NMI")->read() & 1)==1)
287   if ((m_io_nmi->read() & 1)==1)
292288   {
293289      m_port_1ffd_data |= 0x02;
294290      scorpion_update_memory();
trunk/src/mess/drivers/timex.c
r20813r20814
169169/* TS2048 specific functions */
170170
171171
172static  READ8_HANDLER(ts2068_port_f4_r)
172READ8_MEMBER( spectrum_state::ts2068_port_f4_r )
173173{
174   spectrum_state *state = space.machine().driver_data<spectrum_state>();
175
176   return state->m_port_f4_data;
174   return m_port_f4_data;
177175}
178176
179static WRITE8_HANDLER(ts2068_port_f4_w)
177WRITE8_MEMBER( spectrum_state::ts2068_port_f4_w )
180178{
181   spectrum_state *state = space.machine().driver_data<spectrum_state>();
182
183   state->m_port_f4_data = data;
184   ts2068_update_memory(space.machine());
179   m_port_f4_data = data;
180   ts2068_update_memory();
185181}
186182
187static  READ8_HANDLER(ts2068_port_ff_r)
183READ8_MEMBER( spectrum_state::ts2068_port_ff_r )
188184{
189   spectrum_state *state = space.machine().driver_data<spectrum_state>();
190
191   return state->m_port_ff_data;
185   return m_port_ff_data;
192186}
193187
194static WRITE8_HANDLER(ts2068_port_ff_w)
188WRITE8_MEMBER( spectrum_state::ts2068_port_ff_w )
195189{
196190      /* Bits 0-2 Video Mode Select
197191         Bits 3-5 64 column mode ink/paper selection
r20813r20814
199193         Bit  6   17ms Interrupt Inhibit
200194         Bit  7   Cartridge (0) / EXROM (1) select
201195      */
202   spectrum_state *state = space.machine().driver_data<spectrum_state>();
203
204   state->m_port_ff_data = data;
205   ts2068_update_memory(space.machine());
196   m_port_ff_data = data;
197   ts2068_update_memory();
206198   logerror("Port %04x write %02x\n", offset, data);
207199}
208200
r20813r20814
224216 *      at the same time.
225217 *
226218 *******************************************************************/
227void ts2068_update_memory(running_machine &machine)
219void spectrum_state::ts2068_update_memory()
228220{
229   spectrum_state *state = machine.driver_data<spectrum_state>();
230   UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer();
231   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
221   UINT8 *messram = m_ram->pointer();
222   address_space &space = m_maincpu->space(AS_PROGRAM);
232223   unsigned char *ChosenROM, *ExROM;
233224   const timex_cart_t *timex_cart = timex_cart_data();
234225   int timex_cart_type = timex_cart->type;
235226   UINT8 timex_cart_chunks = timex_cart->chunks;
236227   UINT8 *DOCK = timex_cart->data;
237228
238   ExROM = state->memregion("maincpu")->base() + 0x014000;
229   ExROM = memregion("maincpu")->base() + 0x014000;
239230
240   if (state->m_port_f4_data & 0x01)
231   if (m_port_f4_data & 0x01)
241232   {
242      if (state->m_port_ff_data & 0x80)
233      if (m_port_ff_data & 0x80)
243234      {
244235            space.install_read_bank(0x0000, 0x1fff, "bank1");
245236            space.unmap_write(0x0000, 0x1fff);
246            state->membank("bank1")->set_base(ExROM);
237            membank("bank1")->set_base(ExROM);
247238            logerror("0000-1fff EXROM\n");
248239      }
249240      else
250241      {
251242         if (timex_cart_type == TIMEX_CART_DOCK)
252243         {
253            state->membank("bank1")->set_base(DOCK);
244            membank("bank1")->set_base(DOCK);
254245            space.install_read_bank(0x0000, 0x1fff, "bank1");
255246            if (timex_cart_chunks&0x01)
256247               space.install_write_bank(0x0000, 0x1fff, "bank9");
r20813r20814
269260   }
270261   else
271262   {
272      ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x010000;
273      state->membank("bank1")->set_base(ChosenROM);
263      ChosenROM = memregion("maincpu")->base() + 0x010000;
264      membank("bank1")->set_base(ChosenROM);
274265      space.install_read_bank(0x0000, 0x1fff, "bank1");
275266      space.unmap_write(0x0000, 0x1fff);
276267      logerror("0000-1fff HOME\n");
277268   }
278269
279   if (state->m_port_f4_data & 0x02)
270   if (m_port_f4_data & 0x02)
280271   {
281      if (state->m_port_ff_data & 0x80)
272      if (m_port_ff_data & 0x80)
282273      {
283         state->membank("bank2")->set_base(ExROM);
274         membank("bank2")->set_base(ExROM);
284275         space.install_read_bank(0x2000, 0x3fff, "bank2");
285276         space.unmap_write(0x2000, 0x3fff);
286277         logerror("2000-3fff EXROM\n");
r20813r20814
289280      {
290281         if (timex_cart_type == TIMEX_CART_DOCK)
291282         {
292            state->membank("bank2")->set_base(DOCK+0x2000);
283            membank("bank2")->set_base(DOCK+0x2000);
293284            space.install_read_bank(0x2000, 0x3fff, "bank2");
294285            if (timex_cart_chunks&0x02)
295286               space.install_write_bank(0x2000, 0x3fff, "bank10");
r20813r20814
307298   }
308299   else
309300   {
310      ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x012000;
311      state->membank("bank2")->set_base(ChosenROM);
301      ChosenROM = memregion("maincpu")->base() + 0x012000;
302      membank("bank2")->set_base(ChosenROM);
312303      space.install_read_bank(0x2000, 0x3fff, "bank2");
313304      space.unmap_write(0x2000, 0x3fff);
314305      logerror("2000-3fff HOME\n");
315306   }
316307
317   if (state->m_port_f4_data & 0x04)
308   if (m_port_f4_data & 0x04)
318309   {
319      if (state->m_port_ff_data & 0x80)
310      if (m_port_ff_data & 0x80)
320311      {
321         state->membank("bank3")->set_base(ExROM);
312         membank("bank3")->set_base(ExROM);
322313         space.install_read_bank(0x4000, 0x5fff, "bank3");
323314         space.unmap_write(0x4000, 0x5fff);
324315         logerror("4000-5fff EXROM\n");
r20813r20814
327318      {
328319         if (timex_cart_type == TIMEX_CART_DOCK)
329320         {
330            state->membank("bank3")->set_base(DOCK+0x4000);
321            membank("bank3")->set_base(DOCK+0x4000);
331322            space.install_read_bank(0x4000, 0x5fff, "bank3");
332323            if (timex_cart_chunks&0x04)
333324               space.install_write_bank(0x4000, 0x5fff, "bank11");
r20813r20814
344335   }
345336   else
346337   {
347      state->membank("bank3")->set_base(messram);
348      state->membank("bank11")->set_base(messram);
338      membank("bank3")->set_base(messram);
339      membank("bank11")->set_base(messram);
349340      space.install_read_bank(0x4000, 0x5fff, "bank3");
350341      space.install_write_bank(0x4000, 0x5fff, "bank11");
351342      logerror("4000-5fff RAM\n");
352343   }
353344
354   if (state->m_port_f4_data & 0x08)
345   if (m_port_f4_data & 0x08)
355346   {
356      if (state->m_port_ff_data & 0x80)
347      if (m_port_ff_data & 0x80)
357348      {
358         state->membank("bank4")->set_base(ExROM);
349         membank("bank4")->set_base(ExROM);
359350         space.install_read_bank(0x6000, 0x7fff, "bank4");
360351         space.unmap_write(0x6000, 0x7fff);
361352         logerror("6000-7fff EXROM\n");
r20813r20814
364355      {
365356            if (timex_cart_type == TIMEX_CART_DOCK)
366357            {
367               state->membank("bank4")->set_base(DOCK+0x6000);
358               membank("bank4")->set_base(DOCK+0x6000);
368359               space.install_read_bank(0x6000, 0x7fff, "bank4");
369360               if (timex_cart_chunks&0x08)
370361                  space.install_write_bank(0x6000, 0x7fff, "bank12");
r20813r20814
381372   }
382373   else
383374   {
384      state->membank("bank4")->set_base(messram + 0x2000);
385      state->membank("bank12")->set_base(messram + 0x2000);
375      membank("bank4")->set_base(messram + 0x2000);
376      membank("bank12")->set_base(messram + 0x2000);
386377      space.install_read_bank(0x6000, 0x7fff, "bank4");
387378      space.install_write_bank(0x6000, 0x7fff, "bank12");
388379      logerror("6000-7fff RAM\n");
389380   }
390381
391   if (state->m_port_f4_data & 0x10)
382   if (m_port_f4_data & 0x10)
392383   {
393      if (state->m_port_ff_data & 0x80)
384      if (m_port_ff_data & 0x80)
394385      {
395         state->membank("bank5")->set_base(ExROM);
386         membank("bank5")->set_base(ExROM);
396387         space.install_read_bank(0x8000, 0x9fff, "bank5");
397388         space.unmap_write(0x8000, 0x9fff);
398389         logerror("8000-9fff EXROM\n");
r20813r20814
401392      {
402393         if (timex_cart_type == TIMEX_CART_DOCK)
403394         {
404            state->membank("bank5")->set_base(DOCK+0x8000);
395            membank("bank5")->set_base(DOCK+0x8000);
405396            space.install_read_bank(0x8000, 0x9fff,"bank5");
406397            if (timex_cart_chunks&0x10)
407398               space.install_write_bank(0x8000, 0x9fff,"bank13");
r20813r20814
418409   }
419410   else
420411   {
421      state->membank("bank5")->set_base(messram + 0x4000);
422      state->membank("bank13")->set_base(messram + 0x4000);
412      membank("bank5")->set_base(messram + 0x4000);
413      membank("bank13")->set_base(messram + 0x4000);
423414      space.install_read_bank(0x8000, 0x9fff,"bank5");
424415      space.install_write_bank(0x8000, 0x9fff,"bank13");
425416      logerror("8000-9fff RAM\n");
426417   }
427418
428   if (state->m_port_f4_data & 0x20)
419   if (m_port_f4_data & 0x20)
429420   {
430      if (state->m_port_ff_data & 0x80)
421      if (m_port_ff_data & 0x80)
431422      {
432         state->membank("bank6")->set_base(ExROM);
423         membank("bank6")->set_base(ExROM);
433424         space.install_read_bank(0xa000, 0xbfff, "bank6");
434425         space.unmap_write(0xa000, 0xbfff);
435426         logerror("a000-bfff EXROM\n");
r20813r20814
438429      {
439430         if (timex_cart_type == TIMEX_CART_DOCK)
440431         {
441            state->membank("bank6")->set_base(DOCK+0xa000);
432            membank("bank6")->set_base(DOCK+0xa000);
442433            space.install_read_bank(0xa000, 0xbfff, "bank6");
443434            if (timex_cart_chunks&0x20)
444435               space.install_write_bank(0xa000, 0xbfff, "bank14");
r20813r20814
456447   }
457448   else
458449   {
459      state->membank("bank6")->set_base(messram + 0x6000);
460      state->membank("bank14")->set_base(messram + 0x6000);
450      membank("bank6")->set_base(messram + 0x6000);
451      membank("bank14")->set_base(messram + 0x6000);
461452      space.install_read_bank(0xa000, 0xbfff, "bank6");
462453      space.install_write_bank(0xa000, 0xbfff, "bank14");
463454      logerror("a000-bfff RAM\n");
464455   }
465456
466   if (state->m_port_f4_data & 0x40)
457   if (m_port_f4_data & 0x40)
467458   {
468      if (state->m_port_ff_data & 0x80)
459      if (m_port_ff_data & 0x80)
469460      {
470         state->membank("bank7")->set_base(ExROM);
461         membank("bank7")->set_base(ExROM);
471462         space.install_read_bank(0xc000, 0xdfff, "bank7");
472463         space.unmap_write(0xc000, 0xdfff);
473464         logerror("c000-dfff EXROM\n");
r20813r20814
476467      {
477468         if (timex_cart_type == TIMEX_CART_DOCK)
478469         {
479            state->membank("bank7")->set_base(DOCK+0xc000);
470            membank("bank7")->set_base(DOCK+0xc000);
480471            space.install_read_bank(0xc000, 0xdfff, "bank7");
481472            if (timex_cart_chunks&0x40)
482473               space.install_write_bank(0xc000, 0xdfff, "bank15");
r20813r20814
493484   }
494485   else
495486   {
496      state->membank("bank7")->set_base(messram + 0x8000);
497      state->membank("bank15")->set_base(messram + 0x8000);
487      membank("bank7")->set_base(messram + 0x8000);
488      membank("bank15")->set_base(messram + 0x8000);
498489      space.install_read_bank(0xc000, 0xdfff, "bank7");
499490      space.install_write_bank(0xc000, 0xdfff, "bank15");
500491      logerror("c000-dfff RAM\n");
501492   }
502493
503   if (state->m_port_f4_data & 0x80)
494   if (m_port_f4_data & 0x80)
504495   {
505      if (state->m_port_ff_data & 0x80)
496      if (m_port_ff_data & 0x80)
506497      {
507         state->membank("bank8")->set_base(ExROM);
498         membank("bank8")->set_base(ExROM);
508499         space.install_read_bank(0xe000, 0xffff, "bank8");
509500         space.unmap_write(0xe000, 0xffff);
510501         logerror("e000-ffff EXROM\n");
r20813r20814
513504      {
514505         if (timex_cart_type == TIMEX_CART_DOCK)
515506         {
516            state->membank("bank8")->set_base(DOCK+0xe000);
507            membank("bank8")->set_base(DOCK+0xe000);
517508            space.install_read_bank(0xe000, 0xffff, "bank8");
518509            if (timex_cart_chunks&0x80)
519510               space.install_write_bank(0xe000, 0xffff, "bank16");
r20813r20814
530521   }
531522   else
532523   {
533      state->membank("bank8")->set_base(messram + 0xa000);
534      state->membank("bank16")->set_base(messram + 0xa000);
524      membank("bank8")->set_base(messram + 0xa000);
525      membank("bank16")->set_base(messram + 0xa000);
535526      space.install_read_bank(0xe000, 0xffff, "bank8");
536527      space.install_write_bank(0xe000, 0xffff, "bank16");
537528      logerror("e000-ffff RAM\n");
r20813r20814
542533   AM_RANGE(0x1f, 0x1f) AM_READ(spectrum_port_1f_r ) AM_MIRROR(0xff00)
543534   AM_RANGE(0x7f, 0x7f) AM_READ(spectrum_port_7f_r ) AM_MIRROR(0xff00)
544535   AM_RANGE(0xdf, 0xdf) AM_READ(spectrum_port_df_r ) AM_MIRROR(0xff00)
545   AM_RANGE(0xf4, 0xf4) AM_READWRITE_LEGACY(ts2068_port_f4_r,ts2068_port_f4_w ) AM_MIRROR(0xff00)
536   AM_RANGE(0xf4, 0xf4) AM_READWRITE(ts2068_port_f4_r,ts2068_port_f4_w ) AM_MIRROR(0xff00)
546537   AM_RANGE(0xf5, 0xf5) AM_DEVWRITE_LEGACY("ay8912", ay8910_address_w ) AM_MIRROR(0xff00)
547538   AM_RANGE(0xf6, 0xf6) AM_DEVREADWRITE_LEGACY("ay8912", ay8910_r, ay8910_data_w ) AM_MIRROR(0xff00)
548539   AM_RANGE(0xfe, 0xfe) AM_READWRITE(spectrum_port_fe_r,spectrum_port_fe_w )  AM_MIRROR(0xff00)  AM_MASK(0xffff)
549   AM_RANGE(0xff, 0xff) AM_READWRITE_LEGACY(ts2068_port_ff_r,ts2068_port_ff_w ) AM_MIRROR(0xff00)
540   AM_RANGE(0xff, 0xff) AM_READWRITE(ts2068_port_ff_r,ts2068_port_ff_w ) AM_MIRROR(0xff00)
550541ADDRESS_MAP_END
551542
552543static ADDRESS_MAP_START(ts2068_mem, AS_PROGRAM, 8, spectrum_state )
r20813r20814
565556{
566557   m_port_ff_data = 0;
567558   m_port_f4_data = 0;
568   ts2068_update_memory(machine());
559   ts2068_update_memory();
569560   MACHINE_RESET_CALL_MEMBER(spectrum);
570561
571562}
r20813r20814
575566/* TC2048 specific functions */
576567
577568
578static WRITE8_HANDLER( tc2048_port_ff_w )
569WRITE8_MEMBER( spectrum_state::tc2048_port_ff_w )
579570{
580   spectrum_state *state = space.machine().driver_data<spectrum_state>();
581
582   state->m_port_ff_data = data;
571   m_port_ff_data = data;
583572   logerror("Port %04x write %02x\n", offset, data);
584573}
585574
r20813r20814
588577   AM_RANGE(0x1f, 0x1f) AM_READ(spectrum_port_1f_r) AM_MIRROR(0xff00)
589578   AM_RANGE(0x7f, 0x7f) AM_READ(spectrum_port_7f_r) AM_MIRROR(0xff00)
590579   AM_RANGE(0xdf, 0xdf) AM_READ(spectrum_port_df_r) AM_MIRROR(0xff00)
591   AM_RANGE(0xff, 0xff) AM_READWRITE_LEGACY(ts2068_port_ff_r,tc2048_port_ff_w)  AM_MIRROR(0xff00)
580   AM_RANGE(0xff, 0xff) AM_READWRITE(ts2068_port_ff_r,tc2048_port_ff_w)  AM_MIRROR(0xff00)
592581ADDRESS_MAP_END
593582
594583static ADDRESS_MAP_START(tc2048_mem, AS_PROGRAM, 8, spectrum_state )
r20813r20814
598587
599588MACHINE_RESET_MEMBER(spectrum_state,tc2048)
600589{
601   UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer();
590   UINT8 *messram = m_ram->pointer();
602591
603592   membank("bank1")->set_base(messram);
604593   membank("bank2")->set_base(messram);
trunk/src/mess/includes/spectrum.h
r20813r20814
1010#include "imagedev/snapquik.h"
1111#include "imagedev/cartslot.h"
1212#include "machine/upd765.h"
13#include "imagedev/cassette.h"
14#include "sound/speaker.h"
15#include "machine/ram.h"
1316
1417/* Spectrum crystals */
1518
r20813r20814
7073{
7174public:
7275   spectrum_state(const machine_config &mconfig, device_type type, const char *tag)
73      : driver_device(mconfig, type, tag) ,
74      m_video_ram(*this, "video_ram"){ }
76      : driver_device(mconfig, type, tag)
77      , m_video_ram(*this, "video_ram")
78      , m_maincpu(*this, "maincpu")
79      , m_cassette(*this, CASSETTE_TAG)
80      , m_ram(*this, RAM_TAG)
81      , m_speaker(*this, SPEAKER_TAG)
82      , m_upd765(*this, "upd765")
83      , m_upd765_0(*this, "upd765:0")
84      , m_upd765_1(*this, "upd765:1")
85      , m_io_line0(*this, "LINE0")
86      , m_io_line1(*this, "LINE1")
87      , m_io_line2(*this, "LINE2")
88      , m_io_line3(*this, "LINE3")
89      , m_io_line4(*this, "LINE4")
90      , m_io_line5(*this, "LINE5")
91      , m_io_line6(*this, "LINE6")
92      , m_io_line7(*this, "LINE7")
93      , m_io_nmi(*this, "NMI")
94      , m_io_config(*this, "CONFIG")
95      , m_io_joy_intf(*this, "JOY_INTF")
96      , m_io_kempston(*this, "KEMPSTON")
97      , m_io_fuller(*this, "FULLER")
98      , m_io_mikrogen(*this, "MIKROGEN")
99      , m_io_plus0(*this, "PLUS0")
100      , m_io_plus1(*this, "PLUS1")
101      , m_io_plus2(*this, "PLUS2")
102      , m_io_plus3(*this, "PLUS3")
103      , m_io_plus4(*this, "PLUS4")
75104
105   { }
106
76107   int m_port_fe_data;
77108   int m_port_7ffd_data;
78109   int m_port_1ffd_data;   /* scorpion and plus3 */
r20813r20814
106137   DECLARE_READ8_MEMBER(spectrum_port_7f_r);
107138   DECLARE_READ8_MEMBER(spectrum_port_df_r);
108139   DECLARE_READ8_MEMBER(spectrum_port_ula_r);
140
141   DECLARE_WRITE8_MEMBER(spectrum_128_port_7ffd_w);
142   DECLARE_READ8_MEMBER(spectrum_128_ula_r);
143
144   DECLARE_WRITE8_MEMBER(spectrum_plus3_port_3ffd_w);
145   DECLARE_READ8_MEMBER(spectrum_plus3_port_3ffd_r);
146   DECLARE_READ8_MEMBER(spectrum_plus3_port_2ffd_r);
147   DECLARE_WRITE8_MEMBER(spectrum_plus3_port_7ffd_w);
148   DECLARE_WRITE8_MEMBER(spectrum_plus3_port_1ffd_w);
149
150   DECLARE_READ8_MEMBER(ts2068_port_f4_r);
151   DECLARE_WRITE8_MEMBER(ts2068_port_f4_w);
152   DECLARE_READ8_MEMBER(ts2068_port_ff_r);
153   DECLARE_WRITE8_MEMBER(ts2068_port_ff_w);
154   DECLARE_WRITE8_MEMBER(tc2048_port_ff_w);
155
109156   DECLARE_DRIVER_INIT(spectrum);
110157   DECLARE_DRIVER_INIT(plus2);
111158   DECLARE_DRIVER_INIT(plus3);
r20813r20814
131178   bitmap_ind16 m_border_bitmap;
132179
133180   DECLARE_FLOPPY_FORMATS( floppy_formats );
181   void spectrum_128_update_memory();
182   void spectrum_plus3_update_memory();
183   void ts2068_update_memory();
184
185protected:
186   required_device<cpu_device> m_maincpu;
187   required_device<cassette_image_device> m_cassette;
188   required_device<ram_device> m_ram;
189   required_device<device_t> m_speaker;
190   optional_device<upd765a_device> m_upd765;
191   optional_device<floppy_connector> m_upd765_0;
192   optional_device<floppy_connector> m_upd765_1;
193
194   // Regular spectrum ports; marked as optional because of other subclasses
195   optional_ioport m_io_line0;
196   optional_ioport m_io_line1;
197   optional_ioport m_io_line2;
198   optional_ioport m_io_line3;
199   optional_ioport m_io_line4;
200   optional_ioport m_io_line5;
201   optional_ioport m_io_line6;
202   optional_ioport m_io_line7;
203   optional_ioport m_io_nmi;
204   optional_ioport m_io_config;
205   optional_ioport m_io_joy_intf;
206   optional_ioport m_io_kempston;
207   optional_ioport m_io_fuller;
208   optional_ioport m_io_mikrogen;
209   // Plus ports
210   optional_ioport m_io_plus0;
211   optional_ioport m_io_plus1;
212   optional_ioport m_io_plus2;
213   optional_ioport m_io_plus3;
214   optional_ioport m_io_plus4;
215
216   void spectrum_UpdateBorderBitmap();
134217};
135218
136219
r20813r20814
141224
142225MACHINE_CONFIG_EXTERN( spectrum );
143226
144
145
146227/*----------- defined in drivers/spec128.c -----------*/
147228
148229MACHINE_CONFIG_EXTERN( spectrum_128 );
149230
150void spectrum_128_update_memory(running_machine &machine);
151
152/*----------- defined in drivers/specpls3.c -----------*/
153
154void spectrum_plus3_update_memory(running_machine &machine);
155
156/*----------- defined in drivers/timex.c -----------*/
157
158void ts2068_update_memory(running_machine &machine);
159
160/*----------- defined in video/spectrum.c -----------*/
161
162void spectrum_UpdateBorderBitmap(running_machine &machine);
163
164
165
166231#endif /* __SPECTRUM_H__ */
trunk/src/mess/video/spectrum.c
r20813r20814
6767      }
6868
6969
70      spectrum_UpdateBorderBitmap(machine());
70      spectrum_UpdateBorderBitmap();
7171   }
7272}
7373
r20813r20814
181181
182182/* The code below is just a per-pixel 'partial update' for the border */
183183
184INLINE void spectrum_GetNextPos(running_machine &machine, unsigned int &x, unsigned int &y)
184void spectrum_state::spectrum_UpdateBorderBitmap()
185185{
186   spectrum_state *state = machine.driver_data<spectrum_state>();
187   int width = state->m_border_bitmap.width();
188   int height = state->m_border_bitmap.height();
186   unsigned int x = machine().primary_screen->hpos();
187   unsigned int y = machine().primary_screen->vpos();
188   int width = m_border_bitmap.width();
189   int height = m_border_bitmap.height();
189190
190   x += 1;
191191
192   if (x>width)
192   if (m_border_bitmap.valid())
193193   {
194      x = 0;
195      y += 1;
194      int colour = m_port_fe_data & 0x07;
196195
197      if (y>height)
198      {
199         y = 0;
200      }
201   }
202}
196      //printf("update border from %d,%d to %d,%d\n", m_previous_border_x, m_previous_border_y, x, y);
203197
204
205void spectrum_UpdateBorderBitmap(running_machine &machine)
206{
207   spectrum_state *state = machine.driver_data<spectrum_state>();
208   unsigned int x = machine.primary_screen->hpos();
209   unsigned int y = machine.primary_screen->vpos();
210   int width = state->m_border_bitmap.width();
211   int height = state->m_border_bitmap.height();
212
213
214   if (state->m_border_bitmap.valid())
215   {
216      int colour = state->m_port_fe_data & 0x07;
217
218      //printf("update border from %d,%d to %d,%d\n", state->m_previous_border_x, state->m_previous_border_y, x, y);
219
220198      do
221199      {
222         if (state->m_previous_border_y < height)
200         if (m_previous_border_y < height)
223201         {
224            UINT16* bm = &state->m_border_bitmap.pix16(state->m_previous_border_y);
202            UINT16* bm = &m_border_bitmap.pix16(m_previous_border_y);
225203
226            if (state->m_previous_border_x < width)
227               bm[state->m_previous_border_x] = colour;
204            if (m_previous_border_x < width)
205               bm[m_previous_border_x] = colour;
228206         }
229207
230         spectrum_GetNextPos(machine, state->m_previous_border_x, state->m_previous_border_y);
208         m_previous_border_x += 1;
209
210         if (m_previous_border_x > width)
211         {
212            m_previous_border_x = 0;
213            m_previous_border_y += 1;
214
215            if (m_previous_border_y > height)
216            {
217               m_previous_border_y = 0;
218            }
219         }
231220      }
232      while (!((state->m_previous_border_x == x) && (state->m_previous_border_y == y)));
221      while (!((m_previous_border_x == x) && (m_previous_border_y == y)));
233222
234223   }
235224   else

Previous 199869 Revisions Next


© 1997-2024 The MAME Team