Previous 199869 Revisions Next

r22942 Sunday 19th May, 2013 at 18:05:34 UTC by Fabio Priuli
(MESS) wswan.c: updated rom banking mechanism to be save state friendlier and added save state
support to the driver [Fabio Priuli]
[src/mess/audio]wswan.c
[src/mess/drivers]wswan.c
[src/mess/includes]wswan.h
[src/mess/machine]wswan.c
[src/mess/video]wswan.c

trunk/src/mess/includes/wswan.h
r22941r22942
100100   emu_timer *timer;
101101};
102102
103class wswan_sound_device;
104
105
103106class wswan_state : public driver_device
104107{
105108public:
106109   wswan_state(const machine_config &mconfig, device_type type, const char *tag)
107110      : driver_device(mconfig, type, tag),
108111      m_maincpu(*this, "maincpu"),
112      m_sound(*this, "custom"),
109113      m_cursx(*this, "CURSX"),
110114      m_cursy(*this, "CURSY"),
111115      m_buttons(*this, "BUTTONS") { }
r22941r22942
115119   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
116120
117121   required_device<cpu_device> m_maincpu;
122   required_device<wswan_sound_device> m_sound;
118123   DECLARE_READ8_MEMBER(wswan_port_r);
119124   DECLARE_WRITE8_MEMBER(wswan_port_w);
120125   DECLARE_READ8_MEMBER(wswan_sram_r);
121126   DECLARE_WRITE8_MEMBER(wswan_sram_w);
127
122128   VDP m_vdp;
123129   UINT8 m_ws_portram[256];
124130   UINT8 *m_ROMMap[256];
r22941r22942
134140   int m_pal[16][16];
135141   bitmap_ind16 m_bitmap;
136142   UINT8 m_rotate;
143   UINT8 m_bank_base[14];
144
137145   void wswan_clear_irq_line(int irq);
138146   virtual void machine_start();
139147   virtual void machine_reset();
r22941r22942
170178   required_ioport m_cursx;
171179   required_ioport m_cursy;
172180   required_ioport m_buttons;
181   memory_bank *m_rom_bank[14];
173182
174183   void wswan_setup_bios();
184   void wswan_setup_banks();
185   void wswan_register_save();
186   void wswan_postload();
175187   void wswan_handle_irqs();
176188   void wswan_set_irq_line(int irq);
177189   void wswan_setup_palettes();
r22941r22942
186198};
187199
188200
189/*----------- defined in video/wswan.c -----------*/
190
191void wswan_refresh_scanline( running_machine &machine );
192
193
194201/*----------- defined in audio/wswan.c -----------*/
195202
196203//**************************************************************************
r22941r22942
230237protected:
231238   // device-level overrides
232239   virtual void device_start();
240   virtual void device_reset();
233241
234242   // sound stream update overrides
235243   virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
236244
237245public:
238   DECLARE_WRITE8_MEMBER( wswan_sound_port_w );
246   DECLARE_WRITE8_MEMBER( port_w );
239247
240248private:
241249   void wswan_ch_set_freq( CHAN *ch, UINT16 freq );
trunk/src/mess/video/wswan.c
r22941r22942
565565    * Draw sprites in front of foreground layer
566566    */
567567   if ( m_vdp.sprites_enable ) {
568      wswan_handle_sprites(0x2000 );
568      wswan_handle_sprites(0x2000);
569569   }
570570}
571571
r22941r22942
573573void wswan_state::video_start()
574574{
575575   machine().primary_screen->register_screen_bitmap(m_bitmap);
576   save_item(NAME(m_bitmap));
576577}
577578
578579UINT32 wswan_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
trunk/src/mess/drivers/wswan.c
r22941r22942
3838   AM_RANGE(0x00000, 0x03fff) AM_RAM       /* 16kb RAM / 4 colour tiles */
3939   AM_RANGE(0x04000, 0x0ffff) AM_NOP       /* nothing */
4040   AM_RANGE(0x10000, 0x1ffff) AM_READWRITE(wswan_sram_r, wswan_sram_w) /* SRAM bank */
41   AM_RANGE(0x20000, 0x2ffff) AM_ROMBANK("bank2")  /* ROM bank 1 */
42   AM_RANGE(0x30000, 0x3ffff) AM_ROMBANK("bank3")  /* ROM bank 2 */
43   AM_RANGE(0x40000, 0x4ffff) AM_ROMBANK("bank4")  /* ROM bank 3 */
44   AM_RANGE(0x50000, 0x5ffff) AM_ROMBANK("bank5")  /* ROM bank 4 */
45   AM_RANGE(0x60000, 0x6ffff) AM_ROMBANK("bank6")  /* ROM bank 5 */
46   AM_RANGE(0x70000, 0x7ffff) AM_ROMBANK("bank7")  /* ROM bank 6 */
47   AM_RANGE(0x80000, 0x8ffff) AM_ROMBANK("bank8")  /* ROM bank 7 */
48   AM_RANGE(0x90000, 0x9ffff) AM_ROMBANK("bank9")  /* ROM bank 8 */
49   AM_RANGE(0xA0000, 0xAffff) AM_ROMBANK("bank10") /* ROM bank 9 */
50   AM_RANGE(0xB0000, 0xBffff) AM_ROMBANK("bank11") /* ROM bank 10 */
51   AM_RANGE(0xC0000, 0xCffff) AM_ROMBANK("bank12") /* ROM bank 11 */
52   AM_RANGE(0xD0000, 0xDffff) AM_ROMBANK("bank13") /* ROM bank 12 */
53   AM_RANGE(0xE0000, 0xEffff) AM_ROMBANK("bank14") /* ROM bank 13 */
54   AM_RANGE(0xF0000, 0xFffff) AM_ROMBANK("bank15") /* ROM bank 14 */
41   AM_RANGE(0x20000, 0x2ffff) AM_ROMBANK("rom1")  /* ROM bank 1 */
42   AM_RANGE(0x30000, 0x3ffff) AM_ROMBANK("rom2")  /* ROM bank 2 */
43   AM_RANGE(0x40000, 0x4ffff) AM_ROMBANK("rom3")  /* ROM bank 3 */
44   AM_RANGE(0x50000, 0x5ffff) AM_ROMBANK("rom4")  /* ROM bank 4 */
45   AM_RANGE(0x60000, 0x6ffff) AM_ROMBANK("rom5")  /* ROM bank 5 */
46   AM_RANGE(0x70000, 0x7ffff) AM_ROMBANK("rom6")  /* ROM bank 6 */
47   AM_RANGE(0x80000, 0x8ffff) AM_ROMBANK("rom7")  /* ROM bank 7 */
48   AM_RANGE(0x90000, 0x9ffff) AM_ROMBANK("rom8")  /* ROM bank 8 */
49   AM_RANGE(0xa0000, 0xaffff) AM_ROMBANK("rom9")  /* ROM bank 9 */
50   AM_RANGE(0xb0000, 0xbffff) AM_ROMBANK("rom10") /* ROM bank 10 */
51   AM_RANGE(0xc0000, 0xcffff) AM_ROMBANK("rom11") /* ROM bank 11 */
52   AM_RANGE(0xd0000, 0xdffff) AM_ROMBANK("rom12") /* ROM bank 12 */
53   AM_RANGE(0xe0000, 0xeffff) AM_ROMBANK("rom13") /* ROM bank 13 */
54   AM_RANGE(0xf0000, 0xfffff) AM_ROMBANK("rom14") /* ROM bank 14 */
5555ADDRESS_MAP_END
5656
5757static ADDRESS_MAP_START (wscolor_mem, AS_PROGRAM, 8, wswan_state)
5858   AM_RANGE(0x00000, 0x0ffff) AM_RAM       /* 16kb RAM / 4 colour tiles, 16 colour tiles + palettes */
5959   AM_RANGE(0x10000, 0x1ffff) AM_READWRITE(wswan_sram_r, wswan_sram_w) /* SRAM bank */
60   AM_RANGE(0x20000, 0x2ffff) AM_ROMBANK("bank2")  /* ROM bank 1 */
61   AM_RANGE(0x30000, 0x3ffff) AM_ROMBANK("bank3")  /* ROM bank 2 */
62   AM_RANGE(0x40000, 0x4ffff) AM_ROMBANK("bank4")  /* ROM bank 3 */
63   AM_RANGE(0x50000, 0x5ffff) AM_ROMBANK("bank5")  /* ROM bank 4 */
64   AM_RANGE(0x60000, 0x6ffff) AM_ROMBANK("bank6")  /* ROM bank 5 */
65   AM_RANGE(0x70000, 0x7ffff) AM_ROMBANK("bank7")  /* ROM bank 6 */
66   AM_RANGE(0x80000, 0x8ffff) AM_ROMBANK("bank8")  /* ROM bank 7 */
67   AM_RANGE(0x90000, 0x9ffff) AM_ROMBANK("bank9")  /* ROM bank 8 */
68   AM_RANGE(0xA0000, 0xAffff) AM_ROMBANK("bank10") /* ROM bank 9 */
69   AM_RANGE(0xB0000, 0xBffff) AM_ROMBANK("bank11") /* ROM bank 10 */
70   AM_RANGE(0xC0000, 0xCffff) AM_ROMBANK("bank12") /* ROM bank 11 */
71   AM_RANGE(0xD0000, 0xDffff) AM_ROMBANK("bank13") /* ROM bank 12 */
72   AM_RANGE(0xE0000, 0xEffff) AM_ROMBANK("bank14") /* ROM bank 13 */
73   AM_RANGE(0xF0000, 0xFffff) AM_ROMBANK("bank15") /* ROM bank 14 */
60   AM_RANGE(0x20000, 0x2ffff) AM_ROMBANK("rom1")  /* ROM bank 1 */
61   AM_RANGE(0x30000, 0x3ffff) AM_ROMBANK("rom2")  /* ROM bank 2 */
62   AM_RANGE(0x40000, 0x4ffff) AM_ROMBANK("rom3")  /* ROM bank 3 */
63   AM_RANGE(0x50000, 0x5ffff) AM_ROMBANK("rom4")  /* ROM bank 4 */
64   AM_RANGE(0x60000, 0x6ffff) AM_ROMBANK("rom5")  /* ROM bank 5 */
65   AM_RANGE(0x70000, 0x7ffff) AM_ROMBANK("rom6")  /* ROM bank 6 */
66   AM_RANGE(0x80000, 0x8ffff) AM_ROMBANK("rom7")  /* ROM bank 7 */
67   AM_RANGE(0x90000, 0x9ffff) AM_ROMBANK("rom8")  /* ROM bank 8 */
68   AM_RANGE(0xa0000, 0xaffff) AM_ROMBANK("rom9")  /* ROM bank 9 */
69   AM_RANGE(0xb0000, 0xbffff) AM_ROMBANK("rom10") /* ROM bank 10 */
70   AM_RANGE(0xc0000, 0xcffff) AM_ROMBANK("rom11") /* ROM bank 11 */
71   AM_RANGE(0xd0000, 0xdffff) AM_ROMBANK("rom12") /* ROM bank 12 */
72   AM_RANGE(0xe0000, 0xeffff) AM_ROMBANK("rom13") /* ROM bank 13 */
73   AM_RANGE(0xf0000, 0xfffff) AM_ROMBANK("rom14") /* ROM bank 14 */
7474ADDRESS_MAP_END
7575
7676static ADDRESS_MAP_START (wswan_io, AS_IO, 8, wswan_state)
trunk/src/mess/audio/wswan.c
r22941r22942
5656{
5757   m_channel = stream_alloc(0, 2, machine().sample_rate());
5858
59   save_item(NAME(m_sweep_step));
60   save_item(NAME(m_sweep_time));
61   save_item(NAME(m_sweep_count));
62   save_item(NAME(m_noise_type));
63   save_item(NAME(m_noise_reset));
64   save_item(NAME(m_noise_enable));
65   save_item(NAME(m_sample_address));
66   save_item(NAME(m_audio2_voice));
67   save_item(NAME(m_audio3_sweep));
68   save_item(NAME(m_audio4_noise));
69   save_item(NAME(m_mono));
70   save_item(NAME(m_voice_data));
71   save_item(NAME(m_output_volume));
72   save_item(NAME(m_external_stereo));
73   save_item(NAME(m_external_speaker));
74   save_item(NAME(m_noise_shift));
75   save_item(NAME(m_master_volume));
76
77   save_item(NAME(m_audio1.freq));
78   save_item(NAME(m_audio1.period));
79   save_item(NAME(m_audio1.pos));
80   save_item(NAME(m_audio1.vol_left));
81   save_item(NAME(m_audio1.vol_right));
82   save_item(NAME(m_audio1.on));
83   save_item(NAME(m_audio1.signal));
84   
85   save_item(NAME(m_audio2.freq));
86   save_item(NAME(m_audio2.period));
87   save_item(NAME(m_audio2.pos));
88   save_item(NAME(m_audio2.vol_left));
89   save_item(NAME(m_audio2.vol_right));
90   save_item(NAME(m_audio2.on));
91   save_item(NAME(m_audio2.signal));
92   
93   save_item(NAME(m_audio3.freq));
94   save_item(NAME(m_audio3.period));
95   save_item(NAME(m_audio3.pos));
96   save_item(NAME(m_audio3.vol_left));
97   save_item(NAME(m_audio3.vol_right));
98   save_item(NAME(m_audio3.on));
99   save_item(NAME(m_audio3.signal));
100   
101   save_item(NAME(m_audio4.freq));
102   save_item(NAME(m_audio4.period));
103   save_item(NAME(m_audio4.pos));
104   save_item(NAME(m_audio4.vol_left));
105   save_item(NAME(m_audio4.vol_right));
106   save_item(NAME(m_audio4.on));
107   save_item(NAME(m_audio4.signal));
108}
109
110
111//-------------------------------------------------
112//  device_reset
113//-------------------------------------------------
114
115void wswan_sound_device::device_reset()
116{
59117   m_audio1.on = 0;
60118   m_audio1.signal = 16;
61119   m_audio1.pos = 0;
r22941r22942
160218   ch->period = machine().sample_rate() / (3072000 / ((2048 - freq) << 5));
161219}
162220
163WRITE8_MEMBER( wswan_sound_device::wswan_sound_port_w )
221WRITE8_MEMBER( wswan_sound_device::port_w )
164222{
165223   m_channel->update();
166224
trunk/src/mess/machine/wswan.c
r22941r22942
199199   }
200200}
201201
202void wswan_state::wswan_setup_banks()
203{
204   static const char *rom_bank_tags[14] = { "rom1", "rom2", "rom3", "rom4", "rom5", "rom6", "rom7",
205      "rom8", "rom9", "rom10", "rom11", "rom12", "rom13", "rom14" };
206   for (int i = 0; i < 14; i++)
207      m_rom_bank[i] = membank(rom_bank_tags[i]);
208}
209
210void wswan_state::wswan_register_save()
211{
212   save_item(NAME(m_ws_portram));
213   save_item(NAME(m_internal_eeprom));
214   save_item(NAME(m_bios_disabled));
215   save_item(NAME(m_rotate));
216   save_item(NAME(m_bank_base));
217   
218   save_item(NAME(m_vdp.layer_bg_enable));
219   save_item(NAME(m_vdp.layer_fg_enable));
220   save_item(NAME(m_vdp.sprites_enable));
221   save_item(NAME(m_vdp.window_sprites_enable));
222   save_item(NAME(m_vdp.window_fg_mode));
223   save_item(NAME(m_vdp.current_line));
224   save_item(NAME(m_vdp.line_compare));
225   save_item(NAME(m_vdp.sprite_table_address));
226   save_item(NAME(m_vdp.sprite_table_buffer));
227   save_item(NAME(m_vdp.sprite_first));
228   save_item(NAME(m_vdp.sprite_count));
229   save_item(NAME(m_vdp.layer_bg_address));
230   save_item(NAME(m_vdp.layer_fg_address));
231   save_item(NAME(m_vdp.window_fg_left));
232   save_item(NAME(m_vdp.window_fg_top));
233   save_item(NAME(m_vdp.window_fg_right));
234   save_item(NAME(m_vdp.window_fg_bottom));
235   save_item(NAME(m_vdp.window_sprites_left));
236   save_item(NAME(m_vdp.window_sprites_top));
237   save_item(NAME(m_vdp.window_sprites_right));
238   save_item(NAME(m_vdp.window_sprites_bottom));
239   save_item(NAME(m_vdp.layer_bg_scroll_x));
240   save_item(NAME(m_vdp.layer_bg_scroll_y));
241   save_item(NAME(m_vdp.layer_fg_scroll_x));
242   save_item(NAME(m_vdp.layer_fg_scroll_y));
243   save_item(NAME(m_vdp.lcd_enable));
244   save_item(NAME(m_vdp.icons));
245   save_item(NAME(m_vdp.color_mode));
246   save_item(NAME(m_vdp.colors_16));
247   save_item(NAME(m_vdp.tile_packed));
248   save_item(NAME(m_vdp.timer_hblank_enable));
249   save_item(NAME(m_vdp.timer_hblank_mode));
250   save_item(NAME(m_vdp.timer_hblank_reload));
251   save_item(NAME(m_vdp.timer_vblank_enable));
252   save_item(NAME(m_vdp.timer_vblank_mode));
253   save_item(NAME(m_vdp.timer_vblank_reload));
254   save_item(NAME(m_vdp.timer_vblank_count));
255   save_item(NAME(m_vdp.main_palette));
256
257   save_item(NAME(m_eeprom.mode));
258   save_item(NAME(m_eeprom.address));
259   save_item(NAME(m_eeprom.command));
260   save_item(NAME(m_eeprom.start));
261   save_item(NAME(m_eeprom.write_enabled));
262   save_item(NAME(m_eeprom.size));
263   if (m_eeprom.size)
264      save_pointer(NAME(m_eeprom.data), m_eeprom.size);
265   
266   save_item(NAME(m_rtc.present));
267   save_item(NAME(m_rtc.setting));
268   save_item(NAME(m_rtc.year));
269   save_item(NAME(m_rtc.month));
270   save_item(NAME(m_rtc.day));
271   save_item(NAME(m_rtc.day_of_week));
272   save_item(NAME(m_rtc.hour));
273   save_item(NAME(m_rtc.minute));
274   save_item(NAME(m_rtc.second));
275   save_item(NAME(m_rtc.index));
276   
277   save_item(NAME(m_sound_dma.source));
278   save_item(NAME(m_sound_dma.size));
279   save_item(NAME(m_sound_dma.enable));
280
281   machine().save().register_postload(save_prepost_delegate(FUNC(wswan_state::wswan_postload), this));
282}
283
284void wswan_state::wswan_postload()
285{
286   address_space &space = m_maincpu->space(AS_PROGRAM);
287   // restore the vdp pointers
288   m_vdp.vram = (UINT8*)space.get_read_ptr(0);
289   m_vdp.palette_vram = (UINT8*)space.get_read_ptr(( m_system_type == TYPE_WSC ) ? 0xFE00 : 0 );
290   // restore banks
291   for (int i = 0; i < 14; i++)
292      m_rom_bank[i]->set_entry(m_bank_base[i]);
293}
294
295
202296void wswan_state::machine_start()
203297{
204298   m_ws_bios_bank = NULL;
r22941r22942
208302   m_vdp.timer->adjust( attotime::from_ticks( 256, 3072000 ), 0, attotime::from_ticks( 256, 3072000 ) );
209303
210304   wswan_setup_bios();
305   wswan_setup_banks();
306   wswan_register_save();
211307
212308   /* Set up RTC timer */
213   if ( m_rtc.present )
309   if (m_rtc.present)
214310      machine().scheduler().timer_pulse(attotime::from_seconds(1), timer_expired_delegate(FUNC(wswan_state::wswan_rtc_callback),this));
215311
216312   machine().device<nvram_device>("nvram")->set_base(m_internal_eeprom, INTERNAL_EEPROM_SIZE);
r22941r22942
225321   m_vdp.timer->adjust( attotime::from_ticks( 256, 3072000 ), 0, attotime::from_ticks( 256, 3072000 ) );
226322
227323   wswan_setup_bios();
324   wswan_setup_banks();
325   wswan_register_save();
228326
229327   /* Set up RTC timer */
230   if ( m_rtc.present )
328   if (m_rtc.present)
231329      machine().scheduler().timer_pulse(attotime::from_seconds(1), timer_expired_delegate(FUNC(wswan_state::wswan_rtc_callback),this));
232330
233331   machine().device<nvram_device>("nvram")->set_base(m_internal_eeprom, INTERNAL_EEPROM_SIZE);
r22941r22942
235333
236334void wswan_state::machine_reset()
237335{
238   address_space &space = m_maincpu->space( AS_PROGRAM );
336   address_space &space = m_maincpu->space(AS_PROGRAM);
239337
240338   /* Intialize ports */
241   memcpy( m_ws_portram, ws_portram_init, 256 );
339   memcpy(m_ws_portram, ws_portram_init, 256);
242340
243341   /* Initialize VDP */
244   memset( &m_vdp, 0, sizeof( m_vdp ) );
342   memset(&m_vdp, 0, sizeof(m_vdp));
245343
246344   m_vdp.vram = (UINT8*)space.get_read_ptr(0);
247345   m_vdp.palette_vram = (UINT8*)space.get_read_ptr(( m_system_type == TYPE_WSC ) ? 0xFE00 : 0 );
r22941r22942
254352   target->set_view(m_rotate);
255353
256354   /* Initialize sound DMA */
257   memset( &m_sound_dma, 0, sizeof( m_sound_dma ) );
355   memset(&m_sound_dma, 0, sizeof(m_sound_dma));
258356
259357   /* Switch in the banks */
260   membank( "bank2" )->set_base( m_ROMMap[(m_ROMBanks - 1) & (m_ROMBanks - 1)] );
261   membank( "bank3" )->set_base( m_ROMMap[(m_ROMBanks - 1) & (m_ROMBanks - 1)] );
262   membank( "bank4" )->set_base( m_ROMMap[(m_ROMBanks - 12) & (m_ROMBanks - 1)] );
263   membank( "bank5" )->set_base( m_ROMMap[(m_ROMBanks - 11) & (m_ROMBanks - 1)] );
264   membank( "bank6" )->set_base( m_ROMMap[(m_ROMBanks - 10) & (m_ROMBanks - 1)] );
265   membank( "bank7" )->set_base( m_ROMMap[(m_ROMBanks - 9) & (m_ROMBanks - 1)] );
266   membank( "bank8" )->set_base( m_ROMMap[(m_ROMBanks - 8) & (m_ROMBanks - 1)] );
267   membank( "bank9" )->set_base( m_ROMMap[(m_ROMBanks - 7) & (m_ROMBanks - 1)] );
268   membank( "bank10" )->set_base( m_ROMMap[(m_ROMBanks - 6) & (m_ROMBanks - 1)] );
269   membank( "bank11" )->set_base( m_ROMMap[(m_ROMBanks - 5) & (m_ROMBanks - 1)] );
270   membank( "bank12" )->set_base( m_ROMMap[(m_ROMBanks - 4) & (m_ROMBanks - 1)] );
271   membank( "bank13" )->set_base( m_ROMMap[(m_ROMBanks - 3) & (m_ROMBanks - 1)] );
272   membank( "bank14" )->set_base( m_ROMMap[(m_ROMBanks - 2) & (m_ROMBanks - 1)] );
358   for (int bank = 0; bank < 14; bank++)
359   {
360      for (int i = 0; i < m_ROMBanks; i++)
361         m_rom_bank[bank]->configure_entries(i, 1, m_ROMMap[i], 0x10000);
362   }
363   m_rom_bank[13]->configure_entries(m_ROMBanks, 1, m_ws_bios_bank, 0x10000);
364
365   m_bank_base[0] = (m_ROMBanks - 1) & (m_ROMBanks - 1);
366   m_bank_base[1] = (m_ROMBanks - 1) & (m_ROMBanks - 1);
367   m_bank_base[2] = (m_ROMBanks - 12) & (m_ROMBanks - 1);
368   m_bank_base[3] = (m_ROMBanks - 11) & (m_ROMBanks - 1);
369   m_bank_base[4] = (m_ROMBanks - 10) & (m_ROMBanks - 1);
370   m_bank_base[5] = (m_ROMBanks - 9) & (m_ROMBanks - 1);
371   m_bank_base[6] = (m_ROMBanks - 8) & (m_ROMBanks - 1);
372   m_bank_base[7] = (m_ROMBanks - 7) & (m_ROMBanks - 1);
373   m_bank_base[8] = (m_ROMBanks - 6) & (m_ROMBanks - 1);
374   m_bank_base[9] = (m_ROMBanks - 5) & (m_ROMBanks - 1);
375   m_bank_base[10] = (m_ROMBanks - 4) & (m_ROMBanks - 1);
376   m_bank_base[11] = (m_ROMBanks - 3) & (m_ROMBanks - 1);
377   m_bank_base[12] = (m_ROMBanks - 2) & (m_ROMBanks - 1);
378   m_bank_base[13] = m_ROMBanks; // the last bank is mapped to bios at start!
379
273380   m_bios_disabled = 0;
274   membank( "bank15" )->set_base( m_ws_bios_bank );
275//  membank( 15 )->set_base( m_ROMMap[(m_ROMBanks - 1) & (m_ROMBanks - 1)] );
381
382   for (int i = 0; i < 14; i++)
383      m_rom_bank[i]->set_entry(m_bank_base[i]);
276384}
277385
278386READ8_MEMBER( wswan_state::wswan_sram_r )
r22941r22942
846954                   Bit 0-3 - Master volume
847955                   Bit 4-7 - Unknown
848956                */
849         machine().device<wswan_sound_device>("custom")->wswan_sound_port_w( space, offset, data );
957         m_sound->port_w( space, offset, data );
850958         break;
851959      case 0xa0:  /* Hardware type - this is probably read only
852960                   Bit 0   - Enable cartridge slot and/or disable bios
853961                   Bit 1   - Hardware type: 0 = WS, 1 = WSC
854962                   Bit 2-7 - Unknown
855963                */
856         if ( ( data & 0x01 ) && !m_bios_disabled )
964         if ((data & 0x01) && !m_bios_disabled)
857965         {
858966            m_bios_disabled = 1;
859            membank( "bank15" )->set_base( m_ROMMap[ ( ( ( m_ws_portram[0xc0] & 0x0F ) << 4 ) | 15 ) & ( m_ROMBanks - 1 ) ] );
967            m_bank_base[13] = (((m_ws_portram[0xc0] & 0x0f) << 4) | 15) & (m_ROMBanks - 1);
968            m_rom_bank[13]->set_entry(m_bank_base[13]);
860969         }
861970         break;
862971      case 0xa2:  /* Timer control
r22941r22942
10501159            logerror( "Unsupported internal EEPROM command: %X\n", data );
10511160         }
10521161         break;
1053      case 0xc0:  /* ROM bank select for banks 4-15
1054                   Bit 0-3 - ROM bank base register for banks 4-15
1055                   Bit 4-7 - Unknown
1056                */
1057         membank( "bank4" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 4 ) & ( m_ROMBanks - 1 ) ] );
1058         membank( "bank5" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 5 ) & ( m_ROMBanks - 1 ) ] );
1059         membank( "bank6" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 6 ) & ( m_ROMBanks - 1 ) ] );
1060         membank( "bank7" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 7 ) & ( m_ROMBanks - 1 ) ] );
1061         membank( "bank8" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 8 ) & ( m_ROMBanks - 1 ) ] );
1062         membank( "bank9" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 9 ) & ( m_ROMBanks - 1 ) ] );
1063         membank( "bank10" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 10 ) & ( m_ROMBanks - 1 ) ] );
1064         membank( "bank11" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 11 ) & ( m_ROMBanks - 1 ) ] );
1065         membank( "bank12" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 12 ) & ( m_ROMBanks - 1 ) ] );
1066         membank( "bank13" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 13 ) & ( m_ROMBanks - 1 ) ] );
1067         membank( "bank14" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 14 ) & ( m_ROMBanks - 1 ) ] );
1068         if ( m_bios_disabled )
1162      case 0xc0:
1163         // Bit 0-3 - ROM bank base register for rom3-rom14
1164         // Bit 4-7 - Unknown
1165         m_bank_base[2] =  (((data & 0x0f) << 4) |  4) & (m_ROMBanks - 1);
1166         m_bank_base[3] =  (((data & 0x0f) << 4) |  5) & (m_ROMBanks - 1);
1167         m_bank_base[4] =  (((data & 0x0f) << 4) |  6) & (m_ROMBanks - 1);
1168         m_bank_base[5] =  (((data & 0x0f) << 4) |  7) & (m_ROMBanks - 1);
1169         m_bank_base[6] =  (((data & 0x0f) << 4) |  8) & (m_ROMBanks - 1);
1170         m_bank_base[7] =  (((data & 0x0f) << 4) |  9) & (m_ROMBanks - 1);
1171         m_bank_base[8] =  (((data & 0x0f) << 4) | 10) & (m_ROMBanks - 1);
1172         m_bank_base[9] =  (((data & 0x0f) << 4) | 11) & (m_ROMBanks - 1);
1173         m_bank_base[10] = (((data & 0x0f) << 4) | 12) & (m_ROMBanks - 1);
1174         m_bank_base[11] = (((data & 0x0f) << 4) | 13) & (m_ROMBanks - 1);
1175         m_bank_base[12] = (((data & 0x0f) << 4) | 14) & (m_ROMBanks - 1);
1176         for (int i = 2; i < 13; i++)
1177            m_rom_bank[i]->set_entry(m_bank_base[i]);
1178
1179         m_bank_base[13] = m_ROMBanks; // the last bank is mapped to bios at start!
1180         if (m_bios_disabled)
10691181         {
1070            membank( "bank15" )->set_base( m_ROMMap[ ( ( ( data & 0x0F ) << 4 ) | 15 ) & ( m_ROMBanks - 1 ) ] );
1182            m_bank_base[13] = (((data & 0x0f) << 4) | 14) & (m_ROMBanks - 1);
1183            m_rom_bank[13]->set_entry(m_bank_base[13]);
10711184         }
10721185         break;
10731186      case 0xc1:  /* SRAM bank select
r22941r22942
10781191            m_eeprom.page = &m_eeprom.data[ ( data * 64 * 1024 ) & ( m_eeprom.size - 1 ) ];
10791192         }
10801193         break;
1081      case 0xc2:  /* ROM bank select for segment 2 (0x20000 - 0x2ffff)
1082                   Bit 0-7 - ROM bank for segment 2
1083                */
1084         membank( "bank2" )->set_base( m_ROMMap[ data & ( m_ROMBanks - 1 ) ]);
1194      case 0xc2:
1195         // Bit 0-7 - ROM bank for segment 2 (0x20000 - 0x2ffff)
1196         m_bank_base[0] =  data & (m_ROMBanks - 1);
1197         m_rom_bank[0]->set_entry(m_bank_base[0]);
10851198         break;
1086      case 0xc3:  /* ROM bank select for segment 3 (0x30000-0x3ffff)
1087                   Bit 0-7 - ROM bank for segment 3
1088                */
1089         membank( "bank3" )->set_base( m_ROMMap[ data & ( m_ROMBanks - 1 ) ]);
1199      case 0xc3:
1200         // Bit 0-7 - ROM bank for segment 3 (0x30000 - 0x3ffff)
1201         m_bank_base[1] =  data & (m_ROMBanks - 1);
1202         m_rom_bank[1]->set_entry(m_bank_base[1]);
10901203         break;
10911204      case 0xc6:  /* EEPROM address lower bits port/EEPROM address and command port
10921205                   1KBit EEPROM:
r22941r22942
13531466
13541467DEVICE_IMAGE_LOAD_MEMBER(wswan_state,wswan_cart)
13551468{
1356   UINT32 ii, size;
1469   UINT32 size;
13571470   const char *sram_str;
13581471
13591472   if (image.software_entry() == NULL)
r22941r22942
13651478   memset(m_ws_ram, 0, 0xffff);
13661479   m_ROMBanks = size / 65536;
13671480
1368   for (ii = 0; ii < m_ROMBanks; ii++)
1481   for (int i = 0; i < m_ROMBanks; i++)
13691482   {
1370      if ((m_ROMMap[ii] = auto_alloc_array(machine(), UINT8, 0x10000)))
1483      if ((m_ROMMap[i] = auto_alloc_array(machine(), UINT8, 0x10000)))
13711484      {
13721485         if (image.software_entry() == NULL)
13731486         {
1374            if (image.fread( m_ROMMap[ii], 0x10000) != 0x10000)
1487            if (image.fread( m_ROMMap[i], 0x10000) != 0x10000)
13751488            {
13761489               image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Wrongly sized ROM");
13771490               image.message(" Wrongly sized ROM");
r22941r22942
13801493            }
13811494         }
13821495         else
1383            memcpy(m_ROMMap[ii], image.get_software_region("rom") + ii * 0x10000, 0x10000);
1496            memcpy(m_ROMMap[i], image.get_software_region("rom") + i * 0x10000, 0x10000);
13841497      }
13851498      else
13861499      {
r22941r22942
14071520      logerror("\tSRAM size: %s\n", sram_str);
14081521      logerror("\tFeatures: %X\n", m_ROMMap[m_ROMBanks - 1][0xfffc]);
14091522      logerror("\tRTC: %s\n", m_ROMMap[m_ROMBanks - 1][0xfffd] ? "yes" : "no");
1410      for (ii = 0; ii < m_ROMBanks; ii++)
1523      for (int i = 0; i < m_ROMBanks; i++)
14111524      {
14121525         int count;
14131526         for (count = 0; count < 0x10000; count++)
14141527         {
1415            sum += m_ROMMap[ii][count];
1528            sum += m_ROMMap[i][count];
14161529         }
14171530      }
14181531      sum -= m_ROMMap[m_ROMBanks - 1][0xffff];

Previous 199869 Revisions Next


© 1997-2024 The MAME Team