Previous 199869 Revisions Next

r36180 Monday 2nd March, 2015 at 09:51:24 UTC by Alex W. Jackson
thunderx.c: convert to bankdev, merge with gbusters.c, add notes and correct various things based on schematics [Alex Jackson]
[src/mame]mame.mak
[src/mame/drivers]gbusters.c thunderx.c
[src/mame/includes]gbusters.h thunderx.h
[src/mame/video]gbusters.c thunderx.c

trunk/src/mame/drivers/gbusters.c
r244691r244692
1/***************************************************************************
2
3    Gangbusters (GX878) (c) 1988 Konami
4
5    Preliminary driver by:
6        Manuel Abadia <manu@teleline.es>
7
8***************************************************************************/
9
10#include "emu.h"
11#include "cpu/z80/z80.h"
12#include "cpu/m6809/konami.h" /* for the callback and the firq irq definition */
13
14#include "sound/2151intf.h"
15#include "includes/konamipt.h"
16#include "includes/gbusters.h"
17
18INTERRUPT_GEN_MEMBER(gbusters_state::gbusters_interrupt)
19{
20   if (m_k052109->is_irq_enabled())
21      device.execute().set_input_line(KONAMI_IRQ_LINE, HOLD_LINE);
22}
23
24READ8_MEMBER(gbusters_state::bankedram_r)
25{
26   if (m_palette_selected)
27      return m_paletteram[offset];
28   else
29      return m_ram[offset];
30}
31
32WRITE8_MEMBER(gbusters_state::bankedram_w)
33{
34   if (m_palette_selected)
35      m_palette->write(space, offset, data);
36   else
37      m_ram[offset] = data;
38}
39
40WRITE8_MEMBER(gbusters_state::gbusters_1f98_w)
41{
42   /* bit 0 = enable char ROM reading through the video RAM */
43   m_k052109->set_rmrd_line((data & 0x01) ? ASSERT_LINE : CLEAR_LINE);
44
45   /* bit 7 used (during gfx rom tests), but unknown */
46
47   /* other bits unused/unknown */
48   if (data & 0xfe)
49   {
50      //logerror("%04x: (1f98) write %02x\n",space.device().safe_pc(), data);
51      //popmessage("$1f98 = %02x", data);
52   }
53}
54
55WRITE8_MEMBER(gbusters_state::gbusters_coin_counter_w)
56{
57   /* bit 0 select palette RAM  or work RAM at 5800-5fff */
58   m_palette_selected = ~data & 0x01;
59
60   /* bits 1 & 2 = coin counters */
61   coin_counter_w(machine(), 0, data & 0x02);
62   coin_counter_w(machine(), 1, data & 0x04);
63
64   /* bits 3 selects tilemap priority */
65   m_priority = data & 0x08;
66
67   /* bit 7 is used but unknown */
68
69   /* other bits unused/unknown */
70   if (data & 0xf8)
71   {
72#if 0
73      char baf[40];
74      sprintf(baf, "ccnt = %02x", data);
75      popmessage(baf);
76#endif
77      logerror("%04x: (ccount) write %02x\n", space.device().safe_pc(), data);
78   }
79}
80
81WRITE8_MEMBER(gbusters_state::gbusters_unknown_w)
82{
83   logerror("%04x: write %02x to 0x1f9c\n",space.device().safe_pc(), data);
84
85{
86char baf[40];
87   sprintf(baf,"??? = %02x", data);
88//  popmessage(baf);
89}
90}
91
92WRITE8_MEMBER(gbusters_state::gbusters_sh_irqtrigger_w)
93{
94   m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff);
95}
96
97WRITE8_MEMBER(gbusters_state::gbusters_snd_bankswitch_w)
98{
99   int bank_B = BIT(data, 2);  /* ?? */
100   int bank_A = BIT(data, 0);      /* ?? */
101   m_k007232->set_bank(bank_A, bank_B );
102
103#if 0
104   {
105      char baf[40];
106      sprintf(baf,"snd_bankswitch = %02x", data);
107      popmessage(baf);
108   }
109#endif
110}
111
112/* special handlers to combine 052109 & 051960 */
113READ8_MEMBER(gbusters_state::k052109_051960_r)
114{
115   if (m_k052109->get_rmrd_line() == CLEAR_LINE)
116   {
117      if (offset >= 0x3800 && offset < 0x3808)
118         return m_k051960->k051937_r(space, offset - 0x3800);
119      else if (offset < 0x3c00)
120         return m_k052109->read(space, offset);
121      else
122         return m_k051960->k051960_r(space, offset - 0x3c00);
123   }
124   else
125      return m_k052109->read(space, offset);
126}
127
128WRITE8_MEMBER(gbusters_state::k052109_051960_w)
129{
130   if (offset >= 0x3800 && offset < 0x3808)
131      m_k051960->k051937_w(space, offset - 0x3800, data);
132   else if (offset < 0x3c00)
133      m_k052109->write(space, offset, data);
134   else
135      m_k051960->k051960_w(space, offset - 0x3c00, data);
136}
137
138
139static ADDRESS_MAP_START( gbusters_map, AS_PROGRAM, 8, gbusters_state )
140   AM_RANGE(0x1f80, 0x1f80) AM_WRITE(gbusters_coin_counter_w)                      /* coin counters */
141   AM_RANGE(0x1f84, 0x1f84) AM_WRITE(soundlatch_byte_w)                                    /* sound code # */
142   AM_RANGE(0x1f88, 0x1f88) AM_WRITE(gbusters_sh_irqtrigger_w)                     /* cause interrupt on audio CPU */
143   AM_RANGE(0x1f8c, 0x1f8c) AM_WRITE(watchdog_reset_w)                             /* watchdog reset */
144   AM_RANGE(0x1f90, 0x1f90) AM_READ_PORT("SYSTEM")
145   AM_RANGE(0x1f91, 0x1f91) AM_READ_PORT("P1")
146   AM_RANGE(0x1f92, 0x1f92) AM_READ_PORT("P2")
147   AM_RANGE(0x1f93, 0x1f93) AM_READ_PORT("DSW3")
148   AM_RANGE(0x1f94, 0x1f94) AM_READ_PORT("DSW1")
149   AM_RANGE(0x1f95, 0x1f95) AM_READ_PORT("DSW2")
150   AM_RANGE(0x1f98, 0x1f98) AM_WRITE(gbusters_1f98_w)                              /* enable gfx ROM read through VRAM */
151   AM_RANGE(0x1f9c, 0x1f9c) AM_WRITE(gbusters_unknown_w)                           /* ??? */
152   AM_RANGE(0x0000, 0x3fff) AM_READWRITE(k052109_051960_r, k052109_051960_w)       /* tiles + sprites (RAM H21, G21 & H6) */
153   AM_RANGE(0x4000, 0x57ff) AM_RAM                                                 /* RAM I12 */
154   AM_RANGE(0x5800, 0x5fff) AM_READWRITE(bankedram_r, bankedram_w) AM_SHARE("ram") /* palette + work RAM (RAM D16 & C16) */
155   AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank1")                                            /* banked ROM */
156   AM_RANGE(0x8000, 0xffff) AM_ROM                                                 /* ROM 878n02.rom */
157ADDRESS_MAP_END
158
159static ADDRESS_MAP_START( gbusters_sound_map, AS_PROGRAM, 8, gbusters_state )
160   AM_RANGE(0x0000, 0x7fff) AM_ROM                                                 /* ROM 878h01.rom */
161   AM_RANGE(0x8000, 0x87ff) AM_RAM                                                 /* RAM */
162   AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_byte_r)                                 /* soundlatch_byte_r */
163   AM_RANGE(0xb000, 0xb00d) AM_DEVREADWRITE("k007232", k007232_device, read, write)        /* 007232 registers */
164   AM_RANGE(0xc001, 0xc001) AM_DEVREAD("ymsnd", ym2151_device, status_r)                   /* YM 2151 */
165   AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write)               /* YM 2151 */
166   AM_RANGE(0xf000, 0xf000) AM_WRITE(gbusters_snd_bankswitch_w)        /* 007232 bankswitch? */
167ADDRESS_MAP_END
168
169/***************************************************************************
170
171    Input Ports
172
173***************************************************************************/
174
175static INPUT_PORTS_START( gbusters )
176   PORT_START("DSW1")
177   KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
178   /* "No Coin B" = coins produce sound, but no effect on coin counter */
179
180   PORT_START("DSW2")
181   PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )        PORT_DIPLOCATION("SW2:1,2")
182   PORT_DIPSETTING(    0x03, "2" )
183   PORT_DIPSETTING(    0x02, "3" )
184   PORT_DIPSETTING(    0x01, "5" )
185   PORT_DIPSETTING(    0x00, "7" )
186   PORT_DIPNAME( 0x04, 0x04, "Bullets" )           PORT_DIPLOCATION("SW2:3")
187   PORT_DIPSETTING(    0x04, "50" )
188   PORT_DIPSETTING(    0x00, "60" )
189   PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) )   PORT_DIPLOCATION("SW2:4,5")
190   PORT_DIPSETTING(    0x18, "50k, 200k, Every 400k" )
191   PORT_DIPSETTING(    0x10, "70k, 250k, Every 500k" )
192   PORT_DIPSETTING(    0x08, "50k Only" )
193   PORT_DIPSETTING(    0x00, "70k Only" )
194   PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )   PORT_DIPLOCATION("SW2:6,7")
195   PORT_DIPSETTING(    0x60, DEF_STR( Easy ) )
196   PORT_DIPSETTING(    0x40, DEF_STR( Normal ) )
197   PORT_DIPSETTING(    0x20, DEF_STR( Difficult ) )
198   PORT_DIPSETTING(    0x00, DEF_STR( Very_Difficult ) )
199   PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )  PORT_DIPLOCATION("SW2:8")
200   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
201   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
202
203   PORT_START("DSW3")
204   PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )  PORT_DIPLOCATION("SW3:1")
205   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
206   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
207   PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW3:2" ) /* Listed as "Unused" */
208   PORT_SERVICE_DIPLOC(  0x04, IP_ACTIVE_LOW, "SW3:3" )
209   PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" ) /* Listed as "Unused" */
210   PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
211
212   PORT_START("SYSTEM")
213   KONAMI8_SYSTEM_UNK
214
215   PORT_START("P1")
216   KONAMI8_B12_UNK(1)
217
218   PORT_START("P2")
219   KONAMI8_B12_UNK(2)
220INPUT_PORTS_END
221
222
223/***************************************************************************
224
225    Machine Driver
226
227***************************************************************************/
228
229WRITE8_MEMBER(gbusters_state::volume_callback)
230{
231   m_k007232->set_volume(0, (data >> 4) * 0x11, 0);
232   m_k007232->set_volume(1, 0, (data & 0x0f) * 0x11);
233}
234
235void gbusters_state::machine_start()
236{
237   UINT8 *ROM = memregion("maincpu")->base();
238
239   membank("bank1")->configure_entries(0, 16, &ROM[0x10000], 0x2000);
240   membank("bank1")->set_entry(0);
241
242   m_paletteram.resize(0x800);
243   m_palette->basemem().set(m_paletteram, ENDIANNESS_BIG, 2);
244
245   save_item(NAME(m_paletteram));
246   save_item(NAME(m_palette_selected));
247   save_item(NAME(m_priority));
248}
249
250void gbusters_state::machine_reset()
251{
252   UINT8 *RAM = memregion("maincpu")->base();
253
254   /* mirror address for banked ROM */
255   memcpy(&RAM[0x18000], &RAM[0x10000], 0x08000);
256
257   m_palette_selected = 0;
258   m_priority = 0;
259}
260
261WRITE8_MEMBER( gbusters_state::banking_callback )
262{
263   /* bits 0-3 ROM bank */
264   membank("bank1")->set_entry(data & 0x0f);
265
266   if (data & 0xf0)
267   {
268      //logerror("%04x: (lines) write %02x\n",device->safe_pc(), data);
269      //popmessage("lines = %02x", data);
270   }
271
272   /* other bits unknown */
273}
274
275static MACHINE_CONFIG_START( gbusters, gbusters_state )
276
277   /* basic machine hardware */
278   MCFG_CPU_ADD("maincpu", KONAMI, 3000000)    /* Konami custom 052526 */
279   MCFG_CPU_PROGRAM_MAP(gbusters_map)
280   MCFG_CPU_VBLANK_INT_DRIVER("screen", gbusters_state,  gbusters_interrupt)
281   MCFG_KONAMICPU_LINE_CB(WRITE8(gbusters_state, banking_callback))
282
283   MCFG_CPU_ADD("audiocpu", Z80, 3579545)      /* ? */
284   MCFG_CPU_PROGRAM_MAP(gbusters_sound_map)
285
286   /* video hardware */
287   MCFG_SCREEN_ADD("screen", RASTER)
288   MCFG_SCREEN_REFRESH_RATE(60)
289   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
290   MCFG_SCREEN_SIZE(64*8, 32*8)
291   MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 )
292   MCFG_SCREEN_UPDATE_DRIVER(gbusters_state, screen_update_gbusters)
293   MCFG_SCREEN_PALETTE("palette")
294
295   MCFG_PALETTE_ADD("palette", 1024)
296   MCFG_PALETTE_ENABLE_SHADOWS()
297   MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR)
298
299   MCFG_DEVICE_ADD("k052109", K052109, 0)
300   MCFG_GFX_PALETTE("palette")
301   MCFG_K052109_CB(gbusters_state, tile_callback)
302
303   MCFG_DEVICE_ADD("k051960", K051960, 0)
304   MCFG_GFX_PALETTE("palette")
305   MCFG_K051960_CB(gbusters_state, sprite_callback)
306
307   /* sound hardware */
308   MCFG_SPEAKER_STANDARD_MONO("mono")
309
310   MCFG_YM2151_ADD("ymsnd", 3579545)
311   MCFG_SOUND_ROUTE(0, "mono", 0.60)
312   MCFG_SOUND_ROUTE(1, "mono", 0.60)
313
314   MCFG_SOUND_ADD("k007232", K007232, 3579545)
315   MCFG_K007232_PORT_WRITE_HANDLER(WRITE8(gbusters_state, volume_callback))
316   MCFG_SOUND_ROUTE(0, "mono", 0.30)
317   MCFG_SOUND_ROUTE(1, "mono", 0.30)
318MACHINE_CONFIG_END
319
320
321/***************************************************************************
322
323  Game ROMs
324
325***************************************************************************/
326
327ROM_START( gbusters )
328   ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms + space for banked RAM */
329   ROM_LOAD( "878n02.k13", 0x10000, 0x08000, CRC(51697aaa) SHA1(1e6461e2e5e871d44085623a890158a4c1c4c404) )
330   ROM_CONTINUE(           0x08000, 0x08000 )
331   ROM_LOAD( "878j03.k15", 0x20000, 0x10000, CRC(3943a065) SHA1(6b0863f4182e6c973adfaa618f096bd4cc9b7b6d) )
332
333   ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
334   ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) )
335
336   ROM_REGION( 0x80000, "k052109", 0 )    /* tiles */
337   ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) )
338   ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) )
339
340   ROM_REGION( 0x80000, "k051960", 0 )     /* sprites */
341   ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) )
342   ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) )
343
344   ROM_REGION( 0x0100, "proms", 0 )
345   ROM_LOAD( "878a09.f20",   0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */
346
347   ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
348   ROM_LOAD( "878c04.d5",  0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) )
349ROM_END
350
351ROM_START( gbustersa )
352   ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms + space for banked RAM */
353   ROM_LOAD( "878_02.k13", 0x10000, 0x08000, CRC(57178414) SHA1(89b1403158f6ce18706c8a941109554d03cf77d9) ) /* unknown region/version leter */
354   ROM_CONTINUE(           0x08000, 0x08000 )
355   ROM_LOAD( "878_03.k15", 0x20000, 0x10000, CRC(6c59e660) SHA1(66a92eb8a93c9f542489fa31bec6ed1819d174da) ) /* unknown region/version leter */
356
357   ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
358   ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) )
359
360   ROM_REGION( 0x80000, "k052109", 0 )    /* tiles */
361   ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) )
362   ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) )
363
364   ROM_REGION( 0x80000, "k051960", 0 )     /* sprites */
365   ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) )
366   ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) )
367
368   ROM_REGION( 0x0100, "proms", 0 )
369   ROM_LOAD( "878a09.f20",   0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */
370
371   ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
372   ROM_LOAD( "878c04.d5",  0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) )
373ROM_END
374
375ROM_START( crazycop )
376   ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms + space for banked RAM */
377   ROM_LOAD( "878m02.k13", 0x10000, 0x08000, CRC(9c1c9f52) SHA1(7a60ad20aac92da8258b43b04f8c7f27bb71f1df) )
378   ROM_CONTINUE(           0x08000, 0x08000 )
379   ROM_LOAD( "878j03.k15", 0x20000, 0x10000, CRC(3943a065) SHA1(6b0863f4182e6c973adfaa618f096bd4cc9b7b6d) )
380
381   ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
382   ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) )
383
384   ROM_REGION( 0x80000, "k052109", 0 )    /* tiles */
385   ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) )
386   ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) )
387
388   ROM_REGION( 0x80000, "k051960", 0 )     /* sprites */
389   ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) )
390   ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) )
391
392   ROM_REGION( 0x0100, "proms", 0 )
393   ROM_LOAD( "878a09.f20",   0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */
394
395   ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
396   ROM_LOAD( "878c04.d5",  0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) )
397ROM_END
398
399
400
401GAME( 1988, gbusters,  0,        gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Gang Busters (set 1)", GAME_SUPPORTS_SAVE ) /* N02 & J03 program roms */
402GAME( 1988, gbustersa, gbusters, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Gang Busters (set 2)", GAME_SUPPORTS_SAVE ) /* unknown region program roms */
403GAME( 1988, crazycop,  gbusters, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Crazy Cop (Japan)", GAME_SUPPORTS_SAVE )    /* M02 & J03 program roms */
trunk/src/mame/drivers/thunderx.c
r244691r244692
11/***************************************************************************
22
3    Super Contra / Thunder Cross
3    Super Contra  (GX775) (c) 1988 Konami
4    Thunder Cross (GX873) (c) 1988 Konami
5    Gang Busters  (GX878) (c) 1988 Konami
46
57    driver by Bryan McPhail, Manuel Abadia
68
79    K052591 emulation by Eddie Edwards
810
11    These three games run on very similar boards, to the extent that
12    Thunder Cross and Gang Busters share the same schematics with
13    callouts ("USED ONLY GX873" or "USED ONLY GX878") to indicate the
14    per-game differences.
15
16    Super Contra uses an external latch for program ROM banking
17    instead of the builtin banking of the Konami custom CPU,
18    and is the only one of the three games that uses sprite shadows.
19
20    Thunder Cross has no 007232 sound chip, and has a 052591 PMC,
21    a programmable custom chip also used by S.P.Y. and Hexion.
22    Here it's used for collision detection.
23
24    Gang Busters uses the 052526 custom CPU instead of 052001, and
25    has slightly different tile ROM addressing.
26
927- There was a set in MAME at one time that was given the setname (thndrxja)
1028  which is supposedly a later revision of the japanese set currently in MAME.
1129  No roms were ever sourced for this set, so the GAME macro no longer exists.
r244691r244692
2139#include "includes/thunderx.h"
2240
2341
24INTERRUPT_GEN_MEMBER(thunderx_state::scontra_interrupt)
42INTERRUPT_GEN_MEMBER(thunderx_state::vblank_interrupt)
2543{
2644   if (m_k052109->is_irq_enabled())
2745      device.execute().set_input_line(KONAMI_IRQ_LINE, HOLD_LINE);
r244691r244692
3957   }
4058}
4159
42READ8_MEMBER(thunderx_state::scontra_bankedram_r)
43{
44   if (m_palette_selected)
45      return m_paletteram[offset];
46   else
47      return m_ram[offset];
48}
60#define VERBOSE 0
61#define LOG(x)  do { if (VERBOSE) logerror x; } while (0)
62#define PMC_BK (m_1f98_latch & 0x02)
4963
50WRITE8_MEMBER(thunderx_state::scontra_bankedram_w)
64READ8_MEMBER(thunderx_state::pmc_r)
5165{
52   if (m_palette_selected)
53      m_palette->write(space, offset, data);
66   if (PMC_BK)
67   {
68//      logerror("%04x read pmcram %04x\n",space.device().safe_pc(),offset);
69      return m_pmcram[offset];
70   }
5471   else
55      m_ram[offset] = data;
72   {
73      LOG(("%04x read pmc internal ram %04x\n",space.device().safe_pc(),offset));
74      return 0;
75   }
5676}
5777
58READ8_MEMBER(thunderx_state::thunderx_bankedram_r)
78WRITE8_MEMBER(thunderx_state::pmc_w)
5979{
60   if (m_rambank & 0x01)
61      return m_ram[offset];
62   else if (m_rambank & 0x10)
80   if (PMC_BK)
6381   {
64      if (m_pmcbank)
65      {
66//          logerror("%04x read pmcram %04x\n",space.device().safe_pc(),offset);
67         return m_pmcram[offset];
68      }
69      else
70      {
71         logerror("%04x read pmc internal ram %04x\n",space.device().safe_pc(),offset);
72         return 0;
73      }
82      LOG(("%04x pmcram %04x = %02x\n",space.device().safe_pc(),offset,data));
83      m_pmcram[offset] = data;
7484   }
7585   else
76      return m_paletteram[offset];
77}
78
79WRITE8_MEMBER(thunderx_state::thunderx_bankedram_w)
80{
81   if (m_rambank & 0x01)
82      m_ram[offset] = data;
83   else if (m_rambank & 0x10)
8486   {
85      if (m_pmcbank)
86      {
87         logerror("%04x pmcram %04x = %02x\n",space.device().safe_pc(),offset,data);
88         m_pmcram[offset] = data;
89      }
90      else
91         logerror("%04x pmc internal ram %04x = %02x\n",space.device().safe_pc(),offset,data);
87      LOG(("%04x pmc internal ram %04x = %02x\n",space.device().safe_pc(),offset,data));
9288   }
93   else
94      m_palette->write(space, offset, data);
9589}
9690
9791/*
r244691r244692
283277   run_collisions(X0, Y0, X1, Y1, CM, HM);
284278}
285279
286READ8_MEMBER(thunderx_state::thunderx_1f98_r)
280WRITE8_MEMBER(thunderx_state::scontra_1f98_w)
287281{
288   return m_1f98_data;
282   // bit 0 = enable char ROM reading through the video RAM
283   m_k052109->set_rmrd_line((data & 0x01) ? ASSERT_LINE : CLEAR_LINE);
284
285   m_1f98_latch = data;
289286}
290287
288READ8_MEMBER(thunderx_state::_1f98_r)
289{
290   // thunderx and gbusters read from here during the gfx rom test...
291   // though it doesn't look like it should be readable based on the schematics
292   return m_1f98_latch;
293}
294
291295WRITE8_MEMBER(thunderx_state::thunderx_1f98_w)
292296{
293297   // logerror("%04x: 1f98_w %02x\n", space.device().safe_pc(),data);
294298
295   /* bit 0 = enable char ROM reading through the video RAM */
299   // bit 0 = enable char ROM reading through the video RAM
296300   m_k052109->set_rmrd_line((data & 0x01) ? ASSERT_LINE : CLEAR_LINE);
297301
298   /* bit 1 = PMC-BK */
299   m_pmcbank = (data & 0x02) >> 1;
302   // bit 1 = PMC BK (select PMC program or data RAM)
303   // handled in pmc_r() and pmc_w()
300304
301   /* bit 2 = do collision detection when 0->1 */
302   if ((data & 4) && !(m_1f98_data & 4))
305   // bit 2 = PMC START (do collision detection when 0->1)
306   if ((data & 4) && !(m_1f98_latch & 4))
303307   {
304308      calculate_collisions();
305309
r244691r244692
307311      timer_set(downcast<cpu_device *>(&space.device())->cycles_to_attotime(100), TIMER_THUNDERX_FIRQ);
308312   }
309313
310   m_1f98_data = data;
314   m_1f98_latch = data;
311315}
312316
313317WRITE8_MEMBER(thunderx_state::scontra_bankswitch_w)
314318{
315    // logerror("%04x: bank switch %02x\n", space.device().safe_pc(), data & 0x0f);
316    membank("bank1")->set_entry(data & 0x0f);
319   // bits 0-3 select ROM bank at 6000-7fff
320    m_rombank->set_entry(data & 0x0f);
317321
318   /* bit 4 select work RAM or palette RAM at 5800-5fff */
319   m_palette_selected = ~data & 0x10;
322   // bit 4 selects work RAM or palette RAM at 5800-5fff
323   m_bank5800->set_bank((data & 0x10) >> 4);
320324
321   /* bits 5/6 coin counters */
325   // bits 5-6 coin counters
322326   coin_counter_w(machine(), 0, data & 0x20);
323327   coin_counter_w(machine(), 1, data & 0x40);
324328
325   /* bit 7 controls layer priority */
329   // bit 7 controls layer priority
326330   m_priority = data & 0x80;
327331}
328332
329333WRITE8_MEMBER(thunderx_state::thunderx_videobank_w)
330334{
331   //logerror("%04x: select video ram bank %02x\n",space.device().safe_pc(),data);
332   /* 0x01 = work RAM at 4000-5fff */
333   /* 0x00 = palette at 5800-5fff */
334   /* 0x10 = unknown RAM at 5800-5fff */
335   m_rambank = data;
335   // 0x01 = work RAM at 4000-5fff
336   // 0x00 = palette at 5800-5fff
337   // 0x10 = PMC at 5800-5fff
338   m_bank5800->set_bank(data & 0x10 ? 2 : (data & 0x1));
336339
337   /* bits 1/2 coin counters */
340   /* bits 1-2 coin counters */
338341   coin_counter_w(machine(), 0, data & 0x02);
339342   coin_counter_w(machine(), 1, data & 0x04);
340343
341   /* bit 3 controls layer priority (seems to be always 1) */
344   /* bit 3 controls layer priority */
342345   m_priority = data & 0x08;
343346}
344347
345WRITE8_MEMBER(thunderx_state::thunderx_sh_irqtrigger_w)
348WRITE8_MEMBER(thunderx_state::gbusters_videobank_w)
346349{
350   // same as thunderx without the PMC
351   m_bank5800->set_bank(data & 0x1);
352
353   coin_counter_w(machine(), 0, data & 0x02);
354   coin_counter_w(machine(), 1, data & 0x04);
355
356   m_priority = data & 0x08;
357}
358
359WRITE8_MEMBER(thunderx_state::sh_irqtrigger_w)
360{
347361   m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff);
348362}
349363
350WRITE8_MEMBER(thunderx_state::scontra_snd_bankswitch_w)
364WRITE8_MEMBER(thunderx_state::k007232_bankswitch_w)
351365{
352   /* b3-b2: bank for chanel B */
353   /* b1-b0: bank for chanel A */
354
366   /* b3-b2: bank for channel B */
367   /* b1-b0: bank for channel A */
355368   int bank_A = (data & 0x03);
356369   int bank_B = ((data >> 2) & 0x03);
357370   m_k007232->set_bank(bank_A, bank_B);
r244691r244692
387400static ADDRESS_MAP_START( scontra_map, AS_PROGRAM, 8, thunderx_state )
388401   AM_RANGE(0x1f80, 0x1f80) AM_WRITE(scontra_bankswitch_w) /* bankswitch control + coin counters */
389402   AM_RANGE(0x1f84, 0x1f84) AM_WRITE(soundlatch_byte_w)
390   AM_RANGE(0x1f88, 0x1f88) AM_WRITE(thunderx_sh_irqtrigger_w)     /* cause interrupt on audio CPU */
403   AM_RANGE(0x1f88, 0x1f88) AM_WRITE(sh_irqtrigger_w)     /* cause interrupt on audio CPU */
391404   AM_RANGE(0x1f8c, 0x1f8c) AM_WRITE(watchdog_reset_w)
392405   AM_RANGE(0x1f90, 0x1f90) AM_READ_PORT("SYSTEM")
393406   AM_RANGE(0x1f91, 0x1f91) AM_READ_PORT("P1")
r244691r244692
395408   AM_RANGE(0x1f93, 0x1f93) AM_READ_PORT("DSW3")
396409   AM_RANGE(0x1f94, 0x1f94) AM_READ_PORT("DSW1")
397410   AM_RANGE(0x1f95, 0x1f95) AM_READ_PORT("DSW2")
398   AM_RANGE(0x1f98, 0x1f98) AM_WRITE(thunderx_1f98_w)
411   AM_RANGE(0x1f98, 0x1f98) AM_READWRITE(_1f98_r, scontra_1f98_w)
399412   AM_RANGE(0x0000, 0x3fff) AM_READWRITE(k052109_051960_r, k052109_051960_w)       /* video RAM + sprite RAM */
400413
401414   AM_RANGE(0x4000, 0x57ff) AM_RAM
402   AM_RANGE(0x5800, 0x5fff) AM_READWRITE(scontra_bankedram_r, scontra_bankedram_w) AM_SHARE("ram")         /* palette + work RAM */
403   AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank1")
415   AM_RANGE(0x5800, 0x5fff) AM_DEVICE("bank5800", address_map_bank_device, amap8)  /* palette + work RAM + PMC */
416   AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("rombank")
404417   AM_RANGE(0x8000, 0xffff) AM_ROM
405418ADDRESS_MAP_END
406419
407420static ADDRESS_MAP_START( thunderx_map, AS_PROGRAM, 8, thunderx_state )
408421   AM_RANGE(0x1f80, 0x1f80) AM_WRITE(thunderx_videobank_w)
409   AM_RANGE(0x1f84, 0x1f84) AM_WRITE(soundlatch_byte_w)
410   AM_RANGE(0x1f88, 0x1f88) AM_WRITE(thunderx_sh_irqtrigger_w)     /* cause interrupt on audio CPU */
411   AM_RANGE(0x1f8c, 0x1f8c) AM_WRITE(watchdog_reset_w)
412   AM_RANGE(0x1f90, 0x1f90) AM_READ_PORT("SYSTEM")
413   AM_RANGE(0x1f91, 0x1f91) AM_READ_PORT("P1")
414   AM_RANGE(0x1f92, 0x1f92) AM_READ_PORT("P2")
415   AM_RANGE(0x1f93, 0x1f93) AM_READ_PORT("DSW3")
416   AM_RANGE(0x1f94, 0x1f94) AM_READ_PORT("DSW1")
417   AM_RANGE(0x1f95, 0x1f95) AM_READ_PORT("DSW2")
418   AM_RANGE(0x1f98, 0x1f98) AM_READWRITE(thunderx_1f98_r, thunderx_1f98_w) /* registers */
419   AM_RANGE(0x0000, 0x3fff) AM_READWRITE(k052109_051960_r, k052109_051960_w)
422   AM_RANGE(0x1f98, 0x1f98) AM_READWRITE(_1f98_r, thunderx_1f98_w) /* registers */
423   AM_IMPORT_FROM(scontra_map)
424ADDRESS_MAP_END
420425
421   AM_RANGE(0x4000, 0x57ff) AM_RAM
422   AM_RANGE(0x5800, 0x5fff) AM_READWRITE(thunderx_bankedram_r, thunderx_bankedram_w) AM_SHARE("ram")           /* palette + work RAM + unknown RAM */
423   AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank1")
424   AM_RANGE(0x8000, 0xffff) AM_ROM
426static ADDRESS_MAP_START( gbusters_map, AS_PROGRAM, 8, thunderx_state )
427   AM_RANGE(0x1f80, 0x1f80) AM_WRITE(gbusters_videobank_w)
428   AM_IMPORT_FROM(scontra_map)
425429ADDRESS_MAP_END
426430
427static ADDRESS_MAP_START( scontra_sound_map, AS_PROGRAM, 8, thunderx_state )
428   AM_RANGE(0x0000, 0x7fff) AM_ROM                 /* ROM */
429   AM_RANGE(0x8000, 0x87ff) AM_RAM                 /* RAM */
430   AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_byte_r)         /* soundlatch_byte_r */
431   AM_RANGE(0xb000, 0xb00d) AM_DEVREADWRITE("k007232", k007232_device, read, write)        /* 007232 registers */
432   AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write)       /* YM2151 */
433   AM_RANGE(0xf000, 0xf000) AM_WRITE(scontra_snd_bankswitch_w) /* 007232 bank select */
431
432static ADDRESS_MAP_START( scontra_bank5800_map, AS_PROGRAM, 8, thunderx_state )
433   AM_RANGE(0x0000, 0x07ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
434   AM_RANGE(0x0800, 0x0fff) AM_RAM
434435ADDRESS_MAP_END
435436
437static ADDRESS_MAP_START( thunderx_bank5800_map, AS_PROGRAM, 8, thunderx_state )
438   AM_RANGE(0x0000, 0x07ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
439   AM_RANGE(0x0800, 0x0fff) AM_RAM
440   AM_RANGE(0x1000, 0x17ff) AM_READWRITE(pmc_r, pmc_w) AM_SHARE("pmcram")
441ADDRESS_MAP_END
442
443
436444static ADDRESS_MAP_START( thunderx_sound_map, AS_PROGRAM, 8, thunderx_state )
437445   AM_RANGE(0x0000, 0x7fff) AM_ROM
438446   AM_RANGE(0x8000, 0x87ff) AM_RAM
r244691r244692
440448   AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write)
441449ADDRESS_MAP_END
442450
451static ADDRESS_MAP_START( scontra_sound_map, AS_PROGRAM, 8, thunderx_state )
452   AM_RANGE(0xb000, 0xb00d) AM_DEVREADWRITE("k007232", k007232_device, read, write)
453   AM_RANGE(0xf000, 0xf000) AM_WRITE(k007232_bankswitch_w)
454   AM_IMPORT_FROM(thunderx_sound_map)
455ADDRESS_MAP_END
456
443457/***************************************************************************
444458
445459    Input Ports
r244691r244692
494508INPUT_PORTS_END
495509
496510static INPUT_PORTS_START( thunderx )
497   PORT_START("SYSTEM")
498   KONAMI8_SYSTEM_10
499   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
500   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
501   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
511   PORT_INCLUDE( scontra )
502512
503   PORT_START("P1")
504   KONAMI8_B12_UNK(1)
505
506   PORT_START("P2")
507   KONAMI8_B12_UNK(2)
508
509   PORT_START("DSW1")
510   KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
511   /* "No Coin B" = coins produce sound, but no effect on coin counter */
512
513   PORT_START("DSW2")
513   PORT_MODIFY("DSW2")
514514   PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )        PORT_DIPLOCATION("SW2:1,2")
515515   PORT_DIPSETTING(    0x03, "2" )
516516   PORT_DIPSETTING(    0x02, "3" )
r244691r244692
533533   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
534534   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
535535
536   PORT_START("DSW3")
536   PORT_MODIFY("DSW3")
537537   PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )  PORT_DIPLOCATION("SW3:1")
538538   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
539539   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
r244691r244692
555555   PORT_DIPSETTING(    0x00, "50000" )
556556INPUT_PORTS_END
557557
558static INPUT_PORTS_START( gbusters )
559   PORT_INCLUDE( scontra )
558560
561   PORT_MODIFY("DSW2")
562   PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )        PORT_DIPLOCATION("SW2:1,2")
563   PORT_DIPSETTING(    0x03, "2" )
564   PORT_DIPSETTING(    0x02, "3" )
565   PORT_DIPSETTING(    0x01, "5" )
566   PORT_DIPSETTING(    0x00, "7" )
567   PORT_DIPNAME( 0x04, 0x04, "Bullets" )           PORT_DIPLOCATION("SW2:3")
568   PORT_DIPSETTING(    0x04, "50" )
569   PORT_DIPSETTING(    0x00, "60" )
570   PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) )   PORT_DIPLOCATION("SW2:4,5")
571   PORT_DIPSETTING(    0x18, "50k, 200k, Every 400k" )
572   PORT_DIPSETTING(    0x10, "70k, 250k, Every 500k" )
573   PORT_DIPSETTING(    0x08, "50k Only" )
574   PORT_DIPSETTING(    0x00, "70k Only" )
575   PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )   PORT_DIPLOCATION("SW2:6,7")
576   PORT_DIPSETTING(    0x60, DEF_STR( Easy ) )
577   PORT_DIPSETTING(    0x40, DEF_STR( Normal ) )
578   PORT_DIPSETTING(    0x20, DEF_STR( Difficult ) )
579   PORT_DIPSETTING(    0x00, DEF_STR( Very_Difficult ) )
580   PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )  PORT_DIPLOCATION("SW2:8")
581   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
582   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
583
584   PORT_MODIFY("DSW3")
585   PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )  PORT_DIPLOCATION("SW3:1")
586   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
587   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
588   PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW3:2" ) /* Listed as "Unused" */
589   PORT_SERVICE_DIPLOC(  0x04, IP_ACTIVE_LOW, "SW3:3" )
590   PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" ) /* Listed as "Unused" */
591   PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
592INPUT_PORTS_END
593
594
559595/***************************************************************************
560596
561597    Machine Driver
r244691r244692
568604   m_k007232->set_volume(1, 0, (data & 0x0f) * 0x11);
569605}
570606
571MACHINE_START_MEMBER(thunderx_state,scontra)
607void thunderx_state::machine_start()
572608{
573   m_paletteram.resize(0x800);
574   m_palette->basemem().set(m_paletteram, ENDIANNESS_BIG, 2);
575
576   save_item(NAME(m_paletteram));
609   save_item(NAME(m_1f98_latch));
577610   save_item(NAME(m_priority));
578   save_item(NAME(m_1f98_data));
579   save_item(NAME(m_palette_selected));
580   save_item(NAME(m_rambank));
581   save_item(NAME(m_pmcbank));
582611
583    membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base(), 0x2000);
612   // verified from both scontra and thunderx/gbusters schematics
613   // banks 4-7 must mirror banks 0-3 for gbusters rom test to pass
614   UINT8 *ROM = memregion("maincpu")->base();
615   m_rombank->configure_entries(0, 4, &ROM[0], 0x2000);
616   m_rombank->configure_entries(4, 4, &ROM[0], 0x2000);
617   m_rombank->configure_entries(8, 8, &ROM[0x10000], 0x2000);
584618}
585619
586MACHINE_START_MEMBER(thunderx_state,thunderx)
620void thunderx_state::machine_reset()
587621{
588   MACHINE_START_CALL_MEMBER(scontra);
589   memset(m_pmcram, 0, sizeof(m_pmcram));
590   save_item(NAME(m_pmcram));
591}
592
593MACHINE_RESET_MEMBER(thunderx_state, scontra)
594{
622   m_rombank->set_entry(0);
623   m_bank5800->set_bank(0);
624   m_1f98_latch = 0;
595625   m_priority = 0;
596   m_1f98_data = 0;
597   m_palette_selected = 0;
598   m_rambank = 0;
599   m_pmcbank = 0;
600626}
601627
602628static MACHINE_CONFIG_START( scontra, thunderx_state )
r244691r244692
604630   /* basic machine hardware */
605631   MCFG_CPU_ADD("maincpu", KONAMI, XTAL_24MHz/2/4)     /* 052001 (verified on pcb) */
606632   MCFG_CPU_PROGRAM_MAP(scontra_map)
607   MCFG_CPU_VBLANK_INT_DRIVER("screen", thunderx_state,  scontra_interrupt)
633   MCFG_CPU_VBLANK_INT_DRIVER("screen", thunderx_state,  vblank_interrupt)
608634
609635   MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz)     /* verified on pcb */
610636   MCFG_CPU_PROGRAM_MAP(scontra_sound_map)
611637
612   MCFG_MACHINE_START_OVERRIDE(thunderx_state, scontra)
613   MCFG_MACHINE_RESET_OVERRIDE(thunderx_state, scontra)
638   MCFG_DEVICE_ADD("bank5800", ADDRESS_MAP_BANK, 0)
639   MCFG_DEVICE_PROGRAM_MAP(scontra_bank5800_map)
640   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
641   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
642   MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(12)
643   MCFG_ADDRESS_MAP_BANK_STRIDE(0x0800)
614644
615645   /* video hardware */
616646   MCFG_SCREEN_ADD("screen", RASTER)
r244691r244692
618648   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
619649   MCFG_SCREEN_SIZE(64*8, 32*8)
620650   MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 )
621   MCFG_SCREEN_UPDATE_DRIVER(thunderx_state, screen_update_scontra)
651   MCFG_SCREEN_UPDATE_DRIVER(thunderx_state, screen_update)
622652   MCFG_SCREEN_PALETTE("palette")
623653
624654   MCFG_PALETTE_ADD("palette", 1024)
r244691r244692
647677MACHINE_CONFIG_END
648678
649679
650WRITE8_MEMBER( thunderx_state::thunderx_banking_callback )
680WRITE8_MEMBER( thunderx_state::banking_callback )
651681{
652682   //logerror("thunderx %04x: bank select %02x\n", machine().device("maincpu")->safe_pc(), data);
653   membank("bank1")->set_entry(data & 0x0f);
683   m_rombank->set_entry(data & 0x0f);
654684}
655685
656static MACHINE_CONFIG_START( thunderx, thunderx_state )
686static MACHINE_CONFIG_DERIVED( thunderx, scontra )
657687
658688   /* basic machine hardware */
659   MCFG_CPU_ADD("maincpu", KONAMI, XTAL_24MHz/2/4)     /* 052001 (verified on pcb) */
689   MCFG_DEVICE_MODIFY("maincpu")     /* 052001 (verified on pcb) */
660690   MCFG_CPU_PROGRAM_MAP(thunderx_map)
661   MCFG_CPU_VBLANK_INT_DRIVER("screen", thunderx_state,  scontra_interrupt)
662   MCFG_KONAMICPU_LINE_CB(WRITE8(thunderx_state, thunderx_banking_callback))
691   MCFG_KONAMICPU_LINE_CB(WRITE8(thunderx_state, banking_callback))
663692
664   MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz)     /* verified on pcb */
693   MCFG_DEVICE_MODIFY("audiocpu")
665694   MCFG_CPU_PROGRAM_MAP(thunderx_sound_map)
666695
667   MCFG_MACHINE_START_OVERRIDE(thunderx_state, thunderx)
668   MCFG_MACHINE_RESET_OVERRIDE(thunderx_state, scontra)
696   MCFG_DEVICE_MODIFY("bank5800")
697   MCFG_DEVICE_PROGRAM_MAP(thunderx_bank5800_map)
698   MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(13)
669699
670   /* video hardware */
671   MCFG_SCREEN_ADD("screen", RASTER)
672   MCFG_SCREEN_REFRESH_RATE(60)
673   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
674   MCFG_SCREEN_SIZE(64*8, 32*8)
675   MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 )
676   MCFG_SCREEN_UPDATE_DRIVER(thunderx_state, screen_update_scontra)
677   MCFG_SCREEN_PALETTE("palette")
700   MCFG_DEVICE_REMOVE("k007232")
701MACHINE_CONFIG_END
678702
679   MCFG_PALETTE_ADD("palette", 1024)
680   MCFG_PALETTE_ENABLE_SHADOWS()
681   MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR)
703static MACHINE_CONFIG_DERIVED( gbusters, scontra )
682704
683   MCFG_DEVICE_ADD("k052109", K052109, 0)
684   MCFG_GFX_PALETTE("palette")
685   MCFG_K052109_CB(thunderx_state, tile_callback)
705   /* basic machine hardware */
706   MCFG_DEVICE_MODIFY("maincpu")     /* 052526 */
707   MCFG_CPU_PROGRAM_MAP(gbusters_map)
708   MCFG_KONAMICPU_LINE_CB(WRITE8(thunderx_state, banking_callback))
686709
687   MCFG_DEVICE_ADD("k051960", K051960, 0)
688   MCFG_GFX_PALETTE("palette")
689   MCFG_K051960_CB(thunderx_state, sprite_callback)
690
691   /* sound hardware */
692   MCFG_SPEAKER_STANDARD_MONO("mono")
693
694   MCFG_YM2151_ADD("ymsnd", 3579545)
695   MCFG_SOUND_ROUTE(0, "mono", 1.0)
696   MCFG_SOUND_ROUTE(1, "mono", 1.0)
710   MCFG_DEVICE_MODIFY("k052109")
711   MCFG_K052109_CB(thunderx_state, gbusters_tile_callback)
697712MACHINE_CONFIG_END
698713
699714
r244691r244692
939954   ROM_LOAD( "873a08.f20",   0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) )    /* priority encoder (not used) */
940955ROM_END
941956
957ROM_START( gbusters )
958   ROM_REGION( 0x20000, "maincpu", 0 ) /* banked program ROMs */
959   ROM_LOAD( "878n02.k13", 0x00000, 0x10000, CRC(51697aaa) SHA1(1e6461e2e5e871d44085623a890158a4c1c4c404) )   /* banked + fixed ROM */
960   ROM_LOAD( "878j03.k15", 0x10000, 0x10000, CRC(3943a065) SHA1(6b0863f4182e6c973adfaa618f096bd4cc9b7b6d) )   /* banked ROM */
961
962   ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
963   ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) )
964
965   ROM_REGION( 0x80000, "k052109", 0 )    /* tiles */
966   ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) )
967   ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) )
968
969   ROM_REGION( 0x80000, "k051960", 0 )     /* sprites */
970   ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) )
971   ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) )
972
973   ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
974   ROM_LOAD( "878c04.d5",  0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) )
975
976   ROM_REGION( 0x0100, "proms", 0 )
977   ROM_LOAD( "878a09.f20",   0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */
978ROM_END
979
980ROM_START( gbustersa )
981   ROM_REGION( 0x20000, "maincpu", 0 ) /* banked program ROMs */
982   ROM_LOAD( "878_02.k13", 0x00000, 0x10000, CRC(57178414) SHA1(89b1403158f6ce18706c8a941109554d03cf77d9) ) /* unknown region/version leter */
983   ROM_LOAD( "878_03.k15", 0x10000, 0x10000, CRC(6c59e660) SHA1(66a92eb8a93c9f542489fa31bec6ed1819d174da) ) /* unknown region/version leter */
984
985   ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
986   ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) )
987
988   ROM_REGION( 0x80000, "k052109", 0 )    /* tiles */
989   ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) )
990   ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) )
991
992   ROM_REGION( 0x80000, "k051960", 0 )     /* sprites */
993   ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) )
994   ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) )
995
996   ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
997   ROM_LOAD( "878c04.d5",  0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) )
998
999   ROM_REGION( 0x0100, "proms", 0 )
1000   ROM_LOAD( "878a09.f20",   0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */
1001ROM_END
1002
1003ROM_START( crazycop )
1004   ROM_REGION( 0x20000, "maincpu", 0 ) /* banked program ROMs */
1005   ROM_LOAD( "878m02.k13", 0x00000, 0x10000, CRC(9c1c9f52) SHA1(7a60ad20aac92da8258b43b04f8c7f27bb71f1df) )   /* banked + fixed ROM */
1006   ROM_LOAD( "878j03.k15", 0x10000, 0x10000, CRC(3943a065) SHA1(6b0863f4182e6c973adfaa618f096bd4cc9b7b6d) )   /* banked ROM */
1007
1008   ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
1009   ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) )
1010
1011   ROM_REGION( 0x80000, "k052109", 0 )    /* tiles */
1012   ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) )
1013   ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) )
1014
1015   ROM_REGION( 0x80000, "k051960", 0 )     /* sprites */
1016   ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) )
1017   ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) )
1018
1019   ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
1020   ROM_LOAD( "878c04.d5",  0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) )
1021
1022   ROM_REGION( 0x0100, "proms", 0 )
1023   ROM_LOAD( "878a09.f20",   0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */
1024ROM_END
1025
1026
1027
9421028/***************************************************************************/
9431029
9441030GAME( 1988, scontra,   0,        scontra,  scontra, driver_device,  0, ROT90, "Konami", "Super Contra", GAME_SUPPORTS_SAVE )
r244691r244692
9471033GAME( 1988, thunderxa, thunderx, thunderx, thunderx, driver_device, 0, ROT0,  "Konami", "Thunder Cross (set 2)", GAME_SUPPORTS_SAVE )
9481034GAME( 1988, thunderxb, thunderx, thunderx, thunderx, driver_device, 0, ROT0,  "Konami", "Thunder Cross (set 3)", GAME_SUPPORTS_SAVE )
9491035GAME( 1988, thunderxj, thunderx, thunderx, thnderxj, driver_device, 0, ROT0,  "Konami", "Thunder Cross (Japan)", GAME_SUPPORTS_SAVE )
1036GAME( 1988, gbusters,  0,        gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Gang Busters (set 1)", GAME_SUPPORTS_SAVE ) /* N02 & J03 program roms */
1037GAME( 1988, gbustersa, gbusters, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Gang Busters (set 2)", GAME_SUPPORTS_SAVE ) /* unknown region program roms */
1038GAME( 1988, crazycop,  gbusters, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Crazy Cop (Japan)", GAME_SUPPORTS_SAVE )    /* M02 & J03 program roms */
trunk/src/mame/includes/gbusters.h
r244691r244692
1/*************************************************************************
2
3    Gangbusters
4
5*************************************************************************/
6
7#include "sound/k007232.h"
8#include "video/k052109.h"
9#include "video/k051960.h"
10#include "video/konami_helper.h"
11
12class gbusters_state : public driver_device
13{
14public:
15   gbusters_state(const machine_config &mconfig, device_type type, const char *tag)
16      : driver_device(mconfig, type, tag),
17      m_ram(*this, "ram"),
18      m_maincpu(*this, "maincpu"),
19      m_audiocpu(*this, "audiocpu"),
20      m_k007232(*this, "k007232"),
21      m_k052109(*this, "k052109"),
22      m_k051960(*this, "k051960"),
23      m_palette(*this, "palette") { }
24
25   /* memory pointers */
26   required_shared_ptr<UINT8> m_ram;
27   dynamic_array<UINT8> m_paletteram;
28
29   /* video-related */
30   int        m_layer_colorbase[3];
31   int        m_sprite_colorbase;
32
33   /* misc */
34   int        m_palette_selected;
35   int        m_priority;
36
37   /* devices */
38   required_device<cpu_device> m_maincpu;
39   required_device<cpu_device> m_audiocpu;
40   required_device<k007232_device> m_k007232;
41   required_device<k052109_device> m_k052109;
42   required_device<k051960_device> m_k051960;
43   required_device<palette_device> m_palette;
44   DECLARE_READ8_MEMBER(bankedram_r);
45   DECLARE_WRITE8_MEMBER(bankedram_w);
46   DECLARE_WRITE8_MEMBER(gbusters_1f98_w);
47   DECLARE_WRITE8_MEMBER(gbusters_coin_counter_w);
48   DECLARE_WRITE8_MEMBER(gbusters_unknown_w);
49   DECLARE_WRITE8_MEMBER(gbusters_sh_irqtrigger_w);
50   DECLARE_READ8_MEMBER(k052109_051960_r);
51   DECLARE_WRITE8_MEMBER(k052109_051960_w);
52   DECLARE_WRITE8_MEMBER(gbusters_snd_bankswitch_w);
53   virtual void machine_start();
54   virtual void machine_reset();
55   virtual void video_start();
56   UINT32 screen_update_gbusters(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
57   INTERRUPT_GEN_MEMBER(gbusters_interrupt);
58   DECLARE_WRITE8_MEMBER(volume_callback);
59   K052109_CB_MEMBER(tile_callback);
60   K051960_CB_MEMBER(sprite_callback);
61   DECLARE_WRITE8_MEMBER(banking_callback);
62};
trunk/src/mame/includes/thunderx.h
r244691r244692
44
55*************************************************************************/
66#include "cpu/m6809/konami.h"
7#include "machine/bankdev.h"
78#include "sound/k007232.h"
89#include "video/k052109.h"
910#include "video/k051960.h"
r244691r244692
1920
2021   thunderx_state(const machine_config &mconfig, device_type type, const char *tag)
2122      : driver_device(mconfig, type, tag),
22      m_ram(*this, "ram"),
2323      m_maincpu(*this, "maincpu"),
2424      m_audiocpu(*this, "audiocpu"),
25      m_bank5800(*this, "bank5800"),
2526      m_k007232(*this, "k007232"),
2627      m_k052109(*this, "k052109"),
2728      m_k051960(*this, "k051960"),
28      m_palette(*this, "palette") { }
29      m_palette(*this, "palette"),
30      m_rombank(*this, "rombank"),
31      m_pmcram(*this, "pmcram") { }
2932
30   /* memory pointers */
31   required_shared_ptr<UINT8> m_ram;
32   UINT8      m_pmcram[0x800];
33   dynamic_array<UINT8> m_paletteram;
34
35   /* video-related */
36   int        m_layer_colorbase[3];
37   int        m_sprite_colorbase;
38
39   /* misc */
40   int        m_priority;
41   UINT8      m_1f98_data;
42   int        m_palette_selected;
43   int        m_rambank;
44   int        m_pmcbank;
45
4633   /* devices */
4734   required_device<cpu_device> m_maincpu;
4835   required_device<cpu_device> m_audiocpu;
36   required_device<address_map_bank_device> m_bank5800;
4937   optional_device<k007232_device> m_k007232;
5038   required_device<k052109_device> m_k052109;
5139   required_device<k051960_device> m_k051960;
5240   required_device<palette_device> m_palette;
5341
54   DECLARE_READ8_MEMBER(scontra_bankedram_r);
55   DECLARE_WRITE8_MEMBER(scontra_bankedram_w);
56   DECLARE_READ8_MEMBER(thunderx_bankedram_r);
57   DECLARE_WRITE8_MEMBER(thunderx_bankedram_w);
58   DECLARE_READ8_MEMBER(thunderx_1f98_r);
59   DECLARE_WRITE8_MEMBER(thunderx_1f98_w);
42   /* memory */
43   required_memory_bank m_rombank;
44   optional_shared_ptr<UINT8> m_pmcram;
45
46   /* misc */
47   int        m_priority;
48   UINT8      m_1f98_latch;
49
6050   DECLARE_WRITE8_MEMBER(scontra_bankswitch_w);
6151   DECLARE_WRITE8_MEMBER(thunderx_videobank_w);
62   DECLARE_WRITE8_MEMBER(thunderx_sh_irqtrigger_w);
52   DECLARE_WRITE8_MEMBER(gbusters_videobank_w);
53   DECLARE_READ8_MEMBER(pmc_r);
54   DECLARE_WRITE8_MEMBER(pmc_w);
55   DECLARE_WRITE8_MEMBER(scontra_1f98_w);
56   DECLARE_READ8_MEMBER(thunderx_1f98_r);
57   DECLARE_WRITE8_MEMBER(thunderx_1f98_w);
58   DECLARE_WRITE8_MEMBER(sh_irqtrigger_w);
6359   DECLARE_READ8_MEMBER(k052109_051960_r);
6460   DECLARE_WRITE8_MEMBER(k052109_051960_w);
65   DECLARE_WRITE8_MEMBER(scontra_snd_bankswitch_w);
61   DECLARE_WRITE8_MEMBER(k007232_bankswitch_w);
62
63   virtual void machine_start();
64   virtual void machine_reset();
6665    virtual void video_start();
67   DECLARE_MACHINE_START(scontra);
68   DECLARE_MACHINE_RESET(scontra);
69   DECLARE_MACHINE_START(thunderx);
70   UINT32 screen_update_scontra(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
71   INTERRUPT_GEN_MEMBER(scontra_interrupt);
66
67   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
68   INTERRUPT_GEN_MEMBER(vblank_interrupt);
7269   void run_collisions( int s0, int e0, int s1, int e1, int cm, int hm );
7370   void calculate_collisions(  );
7471   DECLARE_WRITE8_MEMBER(volume_callback);
7572   K052109_CB_MEMBER(tile_callback);
73   K052109_CB_MEMBER(gbusters_tile_callback);
7674   K051960_CB_MEMBER(sprite_callback);
77   DECLARE_WRITE8_MEMBER(thunderx_banking_callback);
75   DECLARE_WRITE8_MEMBER(banking_callback);
7876
7977protected:
8078   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
trunk/src/mame/mame.mak
r244691r244692
13461346   $(DRIVERS)/firebeat.o $(MACHINE)/midikbd.o \
13471347   $(DRIVERS)/flkatck.o $(VIDEO)/flkatck.o \
13481348   $(DRIVERS)/gberet.o $(VIDEO)/gberet.o \
1349   $(DRIVERS)/gbusters.o $(VIDEO)/gbusters.o \
13501349   $(DRIVERS)/gijoe.o $(VIDEO)/gijoe.o \
13511350   $(DRIVERS)/gradius3.o $(VIDEO)/gradius3.o \
13521351   $(DRIVERS)/gticlub.o \
trunk/src/mame/video/gbusters.c
r244691r244692
1#include "emu.h"
2#include "includes/gbusters.h"
3
4
5/***************************************************************************
6
7  Callbacks for the K052109
8
9***************************************************************************/
10
11K052109_CB_MEMBER(gbusters_state::tile_callback)
12{
13   /* (color & 0x02) is flip y handled internally by the 052109 */
14   *code |= ((*color & 0x0d) << 8) | ((*color & 0x10) << 5) | (bank << 12);
15   *color = m_layer_colorbase[layer] + ((*color & 0xe0) >> 5);
16}
17
18/***************************************************************************
19
20  Callbacks for the K051960
21
22***************************************************************************/
23
24K051960_CB_MEMBER(gbusters_state::sprite_callback)
25{
26   *priority = (*color & 0x30) >> 4;
27   *color = m_sprite_colorbase + (*color & 0x0f);
28}
29
30
31/***************************************************************************
32
33    Start the video hardware emulation.
34
35***************************************************************************/
36
37void gbusters_state::video_start()
38{
39   m_layer_colorbase[0] = 48;
40   m_layer_colorbase[1] = 0;
41   m_layer_colorbase[2] = 16;
42   m_sprite_colorbase = 32;
43}
44
45
46UINT32 gbusters_state::screen_update_gbusters(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
47{
48   m_k052109->tilemap_update();
49
50   /* sprite priority 3 = disable */
51   if (m_priority)
52   {
53//      m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), 1, 1);  /* are these used? */
54      m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, TILEMAP_DRAW_OPAQUE, 0);
55      m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), 2, 2);
56      m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 0);
57      m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), 0, 0);
58      m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0);
59   }
60   else
61   {
62//      m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), 1, 1);  /* are these used? */
63      m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 0);
64      m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), 2, 2);
65      m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 0);
66      m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), 0, 0);
67      m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0);
68   }
69   return 0;
70}
trunk/src/mame/video/thunderx.c
r244691r244692
77
88***************************************************************************/
99
10static const int layer_colorbase[] = { 768 / 16, 0 / 16, 256 / 16 };
11
1012K052109_CB_MEMBER(thunderx_state::tile_callback)
1113{
1214   *code |= ((*color & 0x1f) << 8) | (bank << 13);
13   *color = m_layer_colorbase[layer] + ((*color & 0xe0) >> 5);
15   *color = layer_colorbase[layer] + ((*color & 0xe0) >> 5);
1416}
1517
18K052109_CB_MEMBER(thunderx_state::gbusters_tile_callback)
19{
20   /* (color & 0x02) is flip y handled internally by the 052109 */
21   *code |= ((*color & 0x0d) << 8) | ((*color & 0x10) << 5) | (bank << 12);
22   *color = layer_colorbase[layer] + ((*color & 0xe0) >> 5);
23}
1624
1725/***************************************************************************
1826
r244691r244692
2028
2129***************************************************************************/
2230
31static const int sprite_colorbase = 512 / 16;
32
2333K051960_CB_MEMBER(thunderx_state::sprite_callback)
2434{
2535   /* Sprite priority 1 means appear behind background, used only to mask sprites */
r244691r244692
2737   /* Sprite priority 3 means don't draw (not used) */
2838   switch (*color & 0x30)
2939   {
30      case 0x00: *priority = 0xf0; break;
31      case 0x10: *priority = 0xf0 | 0xcc | 0xaa; break;
32      case 0x20: *priority = 0xf0 | 0xcc; break;
40      case 0x00: *priority = 0; break;
41      case 0x10: *priority = GFX_PMASK_2 | GFX_PMASK_1; break;
42      case 0x20: *priority = GFX_PMASK_2; break;
3343      case 0x30: *priority = 0xffff; break;
3444   }
3545
36   *color = m_sprite_colorbase + (*color & 0x0f);
46   *color = sprite_colorbase + (*color & 0x0f);
3747}
3848
3949
r244691r244692
4656
4757void thunderx_state::video_start()
4858{
49   m_layer_colorbase[0] = 48;
50   m_layer_colorbase[1] = 0;
51   m_layer_colorbase[2] = 16;
52   m_sprite_colorbase = 32;
53
5459   m_palette->set_shadow_factor(7.0/8.0);
5560}
5661
r244691r244692
6166
6267***************************************************************************/
6368
64UINT32 thunderx_state::screen_update_scontra(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
69UINT32 thunderx_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
6570{
6671   m_k052109->tilemap_update();
6772
6873   screen.priority().fill(0, cliprect);
6974
70   /* The background color is always from layer 1 - but it's always black anyway */
71//  bitmap.fill(16 * m_layer_colorbase[1], cliprect);
72   if (m_priority)
73   {
74      m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, TILEMAP_DRAW_OPAQUE, 1);
75      m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2);
76   }
77   else
78   {
79      m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 1);
80      m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 2);
81   }
82   m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 4);
75   /* The background color is always from layer 1 */
76   m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 0);
8377
78   int bg = m_priority ? 2 : 1;
79   int fg = m_priority ? 1 : 2;
80
81   m_k052109->tilemap_draw(screen, bitmap, cliprect, bg, 0, 1);
82   m_k052109->tilemap_draw(screen, bitmap, cliprect, fg, 0, 2);
8483   m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1);
84   m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0);
8585   return 0;
8686}


Previous 199869 Revisions Next


© 1997-2024 The MAME Team