Previous 199869 Revisions Next

r32273 Monday 22nd September, 2014 at 05:54:05 UTC by Fabio Priuli
(MESS) svi318.c: cleaned up the driver and added support for save states. [Fabio Priuli]
[src/mess/drivers]svi318.c
[src/mess/includes]svi318.h
[src/mess/machine]svi318.c

trunk/src/mess/includes/svi318.h
r32272r32273
7373   DECLARE_READ8_MEMBER(io_ext_r);
7474   DECLARE_WRITE8_MEMBER(io_ext_w);
7575   DECLARE_DRIVER_INIT(svi318);
76   DECLARE_MACHINE_START(svi318_pal);
77   DECLARE_MACHINE_RESET(svi318);
78   DECLARE_MACHINE_RESET(svi328_806);
79   DECLARE_VIDEO_START(svi328_806);
80   DECLARE_MACHINE_START(svi318_ntsc);
76   DECLARE_DRIVER_INIT(svi328_806);
8177   DECLARE_WRITE_LINE_MEMBER(vdp_interrupt);
8278   DECLARE_WRITE_LINE_MEMBER(ins8250_interrupt);
8379   DECLARE_READ8_MEMBER(ppi_port_a_r);
r32272r32273
8985   DECLARE_DEVICE_IMAGE_LOAD_MEMBER(svi318_cart);
9086   DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
9187
88   virtual void machine_start();
89   virtual void machine_reset();
90
9291   MC6845_UPDATE_ROW(crtc_update_row);
9392   memory_region *m_cart_rom;
9493   memory_region *m_bios_rom;
r32272r32273
111110   required_ioport m_buttons;
112111   optional_device<palette_device> m_palette;
113112
114protected:
115   void svi318_set_banks();
116   void svi318_80col_init();
117   void svi318_vdp_interrupt(int i);
118
119113private:
120114   
115   void set_banks();
116   void postload();
117   
121118   // memory banking
122119   UINT8   m_bank_switch;
123120   UINT8   m_bank_low;
r32272r32273
141138   // SVI-806 80 column card
142139   UINT8   m_svi806_present;
143140   UINT8   m_svi806_ram_enabled;
144   memory_region   *m_svi806_ram;
141   dynamic_buffer m_svi806_ram;
145142   UINT8   *m_svi806_gfx;
146143
147144   required_memory_bank m_bank1;
trunk/src/mess/drivers/svi318.c
r32272r32273
266266   MCFG_CPU_IO_MAP(svi318_io)
267267   MCFG_QUANTUM_TIME(attotime::from_hz(60))
268268
269   MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_pal)
270   MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi318)
271
272269   MCFG_DEVICE_ADD("ppi8255", I8255, 0)
273270   MCFG_I8255_IN_PORTA_CB(READ8(svi318_state, ppi_port_a_r))
274271   MCFG_I8255_IN_PORTB_CB(READ8(svi318_state, ppi_port_b_r))
r32272r32273
336333   MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(svi318_state, vdp_interrupt))
337334   MCFG_TMS9928A_SCREEN_ADD_NTSC("screen")
338335   MCFG_SCREEN_UPDATE_DEVICE("tms9928a", tms9928a_device, screen_update)
339
340   MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_ntsc)
341   MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi318)
342336MACHINE_CONFIG_END
343337
344338static MACHINE_CONFIG_DERIVED( svi328, svi318 )
r32272r32273
383377   MCFG_CPU_IO_MAP(svi328_806_io)
384378   MCFG_QUANTUM_TIME(attotime::from_hz(60))
385379
386   MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_pal)
387   MCFG_MACHINE_RESET_OVERRIDE(svi318_state, svi328_806)
388
389380   MCFG_DEVICE_ADD("ppi8255", I8255, 0)
390381   MCFG_I8255_IN_PORTA_CB(READ8(svi318_state, ppi_port_a_r))
391382   MCFG_I8255_IN_PORTB_CB(READ8(svi318_state, ppi_port_b_r))
r32272r32273
421412   MCFG_MC6845_CHAR_WIDTH(8)   /* ? */
422413   MCFG_MC6845_UPDATE_ROW_CB(svi318_state, crtc_update_row)
423414
424   MCFG_VIDEO_START_OVERRIDE(svi318_state, svi328_806)
425
426415   /* Sound hardware */
427416   MCFG_SPEAKER_STANDARD_MONO("mono")
428417   MCFG_SOUND_ADD("dac", DAC, 0)
r32272r32273
452441
453442   MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(svi318_floppy_interface)
454443
444   /* Software lists */
445   MCFG_SOFTWARE_LIST_ADD("cass_list", "svi318_flop")
446   MCFG_SOFTWARE_LIST_ADD("disk_list", "svi318_cass")
447
455448   MCFG_FRAGMENT_ADD(svi318_cartslot)
456449
457450   /* internal ram */
r32272r32273
462455
463456static MACHINE_CONFIG_DERIVED( svi328n_806, svi328_806 )
464457
465   MCFG_MACHINE_START_OVERRIDE(svi318_state, svi318_ntsc)
466
467458   MCFG_SCREEN_MODIFY("screen")
468459   MCFG_SCREEN_REFRESH_RATE(60)
469460MACHINE_CONFIG_END
r32272r32273
537528ROM_END
538529
539530
540/*    YEAR  NAME        PARENT  COMPAT  MACHINE        INPUT   INIT     COMPANY         FULLNAME                    FLAGS */
541COMP( 1983, svi318,     0,      0,      svi318,        svi318, svi318_state, svi318,  "Spectravideo", "SVI-318 (PAL)",            0 )
542COMP( 1983, svi318n,    svi318, 0,      svi318n,       svi318, svi318_state, svi318,  "Spectravideo", "SVI-318 (NTSC)",           0 )
543COMP( 1983, svi328,     svi318, 0,      svi328,        svi328, svi318_state, svi318,  "Spectravideo", "SVI-328 (PAL)",            0 )
544COMP( 1983, svi328n,    svi318, 0,      svi328n,       svi328, svi318_state, svi318,  "Spectravideo", "SVI-328 (NTSC)",           0 )
545COMP( 1983, sv328p80,   svi318, 0,      svi328_806,    svi328, svi318_state, svi318,  "Spectravideo", "SVI-328 (PAL) + SVI-806 80 column card", 0 )
546COMP( 1983, sv328n80,   svi318, 0,      svi328n_806,   svi328, svi318_state, svi318,  "Spectravideo", "SVI-328 (NTSC) + SVI-806 80 column card", 0 )
531/*    YEAR  NAME        PARENT  COMPAT  MACHINE        INPUT   INIT                       COMPANY         FULLNAME                    FLAGS */
532COMP( 1983, svi318,     0,      0,      svi318,        svi318, svi318_state, svi318,      "Spectravideo", "SVI-318 (PAL)",   GAME_SUPPORTS_SAVE )
533COMP( 1983, svi318n,    svi318, 0,      svi318n,       svi318, svi318_state, svi318,      "Spectravideo", "SVI-318 (NTSC)",  GAME_SUPPORTS_SAVE )
534COMP( 1983, svi328,     svi318, 0,      svi328,        svi328, svi318_state, svi318,      "Spectravideo", "SVI-328 (PAL)",   GAME_SUPPORTS_SAVE )
535COMP( 1983, svi328n,    svi318, 0,      svi328n,       svi328, svi318_state, svi318,      "Spectravideo", "SVI-328 (NTSC)",  GAME_SUPPORTS_SAVE )
536COMP( 1983, sv328p80,   svi318, 0,      svi328_806,    svi328, svi318_state, svi328_806,  "Spectravideo", "SVI-328 (PAL) + SVI-806 80 column card",  GAME_SUPPORTS_SAVE )
537COMP( 1983, sv328n80,   svi318, 0,      svi328n_806,   svi328, svi318_state, svi328_806,  "Spectravideo", "SVI-328 (NTSC) + SVI-806 80 column card", GAME_SUPPORTS_SAVE )
trunk/src/mess/machine/svi318.c
r32272r32273
204204      set_led_status(machine(), 0, !(data & 0x20));
205205
206206   m_bank_switch = data;
207   svi318_set_banks();
207   set_banks();
208208}
209209
210210/* Disk drives  */
r32272r32273
256256
257257   for (int i = 0; i < x_count; i++)
258258   {
259      UINT8 data = m_svi806_gfx[m_svi806_ram->u8((ma + i) & 0x7ff) * 16 + ra];
259      UINT8 data = m_svi806_gfx[m_svi806_ram[(ma + i) & 0x7ff] * 16 + ra];
260260
261261      if (i == cursor_x)
262262      {
263         data = 0xFF;
263         data = 0xff;
264264      }
265265
266266      for (int j = 0; j < 8; j++)
r32272r32273
272272}
273273
274274
275/* 80 column card init */
276void svi318_state::svi318_80col_init()
277{
278   /* 2K RAM, but allocating 4KB to make banking easier */
279   /* The upper 2KB will be set to FFs and will never be written to */
280   m_svi806_ram = machine().memory().region_alloc("gfx2", 0x1000, 1, ENDIANNESS_LITTLE);
281   memset(m_svi806_ram->base(), 0x00, 0x800);
282   memset(m_svi806_ram->base() + 0x800, 0xff, 0x800);
283   m_svi806_gfx = memregion("gfx1")->base();
284}
285
286
287275WRITE8_MEMBER(svi318_state::svi806_ram_enable_w)
288276{
289277   m_svi806_ram_enabled = (data & 0x01);
290   svi318_set_banks();
278   set_banks();
291279}
292280
293VIDEO_START_MEMBER(svi318_state, svi328_806)
294{
295}
296281
297MACHINE_RESET_MEMBER(svi318_state, svi328_806)
298{
299   MACHINE_RESET_CALL_MEMBER(svi318);
300
301   svi318_80col_init();
302   m_svi806_present = 1;
303   svi318_set_banks();
304
305   /* Set SVI-806 80 column card palette */
306   m_palette->set_pen_color(TMS9928A_PALETTE_SIZE, 0, 0, 0);     /* Monochrome black */
307   m_palette->set_pen_color(TMS9928A_PALETTE_SIZE+1, 0, 224, 0); /* Monochrome green */
308}
309
310282/* Init functions */
311283
312void svi318_state::svi318_vdp_interrupt(int i)
313{
314   m_maincpu->set_input_line(0, (i ? HOLD_LINE : CLEAR_LINE));
315}
316
317
318284static const UINT8 cc_op[0x100] = {
319285   4+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1, 4+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,
320286   8+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,12+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,
r32272r32273
444410   
445411   m_bank_low_ptr = m_empty_bank;
446412   m_bank_high1_ptr = m_empty_bank;
447   m_bank_high2_ptr = m_empty_bank;
448   
413   m_bank_high2_ptr = m_empty_bank;   
449414}
450415
451MACHINE_START_MEMBER(svi318_state, svi318_ntsc)
416DRIVER_INIT_MEMBER(svi318_state, svi328_806)
452417{
453   astring region_tag;
454   m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG));
455   m_bios_rom = memregion("maincpu");
418   DRIVER_INIT_CALL(svi318);
419   m_svi806_present = 1;
456420}
457421
458MACHINE_START_MEMBER(svi318_state, svi318_pal)
422void svi318_state::machine_start()
459423{
460424   astring region_tag;
461425   m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG));
462426   m_bios_rom = memregion("maincpu");
427
428   // 80 column card start
429   if (m_svi806_present)
430   {
431      // 2K RAM, but allocating 4KB to make banking easier
432      // The upper 2KB will be set to FFs and will never be written to
433      m_svi806_ram.resize(0x1000);
434      save_item(NAME(m_svi806_ram));
435      memset(m_svi806_ram, 0x00, 0x800);
436      memset(m_svi806_ram + 0x800, 0xff, 0x800);
437     
438      m_svi806_gfx = memregion("gfx1")->base();
439     
440      // Set SVI-806 80 column card palette
441      m_palette->set_pen_color(TMS9928A_PALETTE_SIZE, 0, 0, 0);     /* Monochrome black */
442      m_palette->set_pen_color(TMS9928A_PALETTE_SIZE+1, 0, 224, 0); /* Monochrome green */
443   }
444
445   // register for savestates
446   save_item(NAME(m_driveselect));
447   save_item(NAME(m_drq));
448   save_item(NAME(m_irq));
449   save_item(NAME(m_heads));
450
451   save_item(NAME(m_bank_switch));
452   save_item(NAME(m_bank_low));
453   save_item(NAME(m_bank_high));
454   save_item(NAME(m_bank_low_read_only));
455   save_item(NAME(m_bank_high1_read_only));
456   save_item(NAME(m_bank_high2_read_only));
457   save_item(NAME(m_keyboard_row));
458   save_item(NAME(m_centronics_busy));
459
460   save_item(NAME(m_svi806_present));
461   save_item(NAME(m_svi806_ram_enabled));
462   
463   machine().save().register_postload(save_prepost_delegate(FUNC(svi318_state::postload), this));
463464}
464465
466
465467static void svi318_load_proc(device_image_interface &image)
466468{
467469   svi318_state *state = image.device().machine().driver_data<svi318_state>();
r32272r32273
482484   }
483485}
484486
485MACHINE_RESET_MEMBER(svi318_state, svi318)
487void svi318_state::machine_reset()
486488{   
487489   m_keyboard_row = 0;
488490   m_centronics_busy = 0;
r32272r32273
499501   m_bank_high2_read_only = 0;
500502
501503   m_bank_switch = 0xff;
502   svi318_set_banks();
504   set_banks();
503505
504506   for (int drive = 0; drive < 2; drive++)
505507      floppy_get_device(machine(), drive)->floppy_install_load_proc(svi318_load_proc);
r32272r32273
536538   if (m_svi806_ram_enabled)
537539   {
538540      if (offset < 0x800)
539         m_svi806_ram->u8(offset) = data;
541         m_svi806_ram[offset] = data;
540542   }
541543   else
542544   {
r32272r32273
547549   }
548550}
549551
550void svi318_state::svi318_set_banks()
552void svi318_state::set_banks()
551553{
552554   const UINT8 v = m_bank_switch;
553555   UINT8 *ram = m_ram->pointer();
r32272r32273
653655   }
654656}
655657
658void svi318_state::postload()
659{
660   set_banks();
661}
662
663
656664/* External I/O */
657665
658666WRITE_LINE_MEMBER(svi318_state::write_centronics_busy)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team