Previous 199869 Revisions Next

r31286 Tuesday 15th July, 2014 at 13:49:16 UTC by Robbbert
mrgame.c : added some video
[src/mame/drivers]mrgame.c

trunk/src/mame/drivers/mrgame.c
r31285r31286
1010- Support for unknown M114 audio processor
1111- Support for electronic volume control
1212- Audio rom banking
13- Wrong colours
14- Bad scrolling
15- No sound
16- wcup90 needs different address maps and display
1317
1418*****************************************************************************************/
1519
r31285r31286
1822#include "cpu/m68000/m68000.h"
1923#include "cpu/z80/z80.h"
2024#include "machine/nvram.h"
25#include "video/resnet.h"
2126#include "sound/tms5220.h"
2227#include "sound/dac.h"
2328#include "machine/i8255.h"
r31285r31286
2732public:
2833   mrgame_state(const machine_config &mconfig, device_type type, const char *tag)
2934      : driver_device(mconfig, type, tag)
35      , m_palette(*this, "palette")
36      , m_p_videoram(*this, "videoram")
37      , m_p_objectram(*this, "objectram")
38      , m_gfxdecode(*this, "gfxdecode")
3039      , m_maincpu(*this, "maincpu")
3140      , m_audiocpu1(*this, "audiocpu1")
3241      , m_audiocpu2(*this, "audiocpu2")
3342   { }
3443
44   DECLARE_PALETTE_INIT(mrgame);
3545   DECLARE_DRIVER_INIT(mrgame);
3646   DECLARE_WRITE8_MEMBER(ack1_w);
3747   DECLARE_WRITE8_MEMBER(ack2_w);
48   DECLARE_WRITE8_MEMBER(portb_w);
49   DECLARE_WRITE8_MEMBER(row_w);
3850   DECLARE_WRITE8_MEMBER(sound_w);
51   DECLARE_WRITE8_MEMBER(triple_w);
52   DECLARE_WRITE8_MEMBER(video_w);
53   DECLARE_WRITE8_MEMBER(video_ctrl_w);
54   DECLARE_READ8_MEMBER(col_r);
3955   DECLARE_READ8_MEMBER(sound_r);
56   DECLARE_READ8_MEMBER(porta_r);
57   DECLARE_READ8_MEMBER(portc_r);
4058   DECLARE_READ8_MEMBER(rsw_r);
4159   TIMER_DEVICE_CALLBACK_MEMBER(irq_timer);
60   UINT32 screen_update_mrgame(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
61   required_device<palette_device> m_palette;
62   required_shared_ptr<UINT8> m_p_videoram;
63   required_shared_ptr<UINT8> m_p_objectram;
64   required_device<gfxdecode_device> m_gfxdecode;
4265private:
4366   bool m_ack1;
4467   bool m_ack2;
68   bool m_ackv;
4569   UINT8 m_irq_state;
70   UINT8 m_row_data;
4671   UINT8 m_sound_data;
72   UINT8 m_gfx_bank;
73   UINT8 m_video_data;
74   UINT8 m_video_status;
75   UINT8 m_video_ctrl[8];
76   const UINT8 *m_p_chargen;
4777   virtual void machine_reset();
4878   required_device<m68000_device> m_maincpu;
4979   required_device<z80_device> m_audiocpu1;
r31285r31286
5686   AM_RANGE(0x020000, 0x02ffff) AM_RAM AM_SHARE("nvram")
5787   AM_RANGE(0x030000, 0x030001) AM_READ8(rsw_r, 0xff) //RSW ACK
5888   AM_RANGE(0x030002, 0x030003) AM_WRITE8(sound_w, 0xff) //W SOUND
59   AM_RANGE(0x030004, 0x030005) //W VID
60   AM_RANGE(0x030006, 0x030007) //W CS
61   AM_RANGE(0x030008, 0x030009) //W DATA
62   AM_RANGE(0x03000a, 0x03000b) AM_WRITENOP //W ROW
63   AM_RANGE(0x03000c, 0x03000d) //R COL
64   AM_RANGE(0x03000e, 0x03000f) //EXT ADD
89   AM_RANGE(0x030004, 0x030005) AM_WRITE8(video_w, 0xff00) //W VID
90   AM_RANGE(0x030006, 0x030007) AM_WRITE8(triple_w, 0xff) //W CS
91   AM_RANGE(0x030008, 0x030009) AM_WRITENOP //W DATA - lamp/sol data
92   AM_RANGE(0x03000a, 0x03000b) AM_WRITE8(row_w, 0xff) //W ROW
93   AM_RANGE(0x03000c, 0x03000d) AM_READ8(col_r, 0xff) //R COL
94   AM_RANGE(0x03000e, 0x03000f) AM_WRITENOP //EXT ADD - lamp/sol data
6595ADDRESS_MAP_END
6696
6797static ADDRESS_MAP_START( video_map, AS_PROGRAM, 8, mrgame_state )
6898   AM_RANGE(0x0000, 0x3fff) AM_ROM AM_REGION("video", 0)
6999   AM_RANGE(0x4000, 0x47ff) AM_RAM
70   AM_RANGE(0x4800, 0x4fff) AM_RAM
71   AM_RANGE(0x5000, 0x57ff) AM_RAM
72   AM_RANGE(0x6800, 0x6fff) AM_RAM
73   AM_RANGE(0x8100, 0x8103) AM_MIRROR(0x7efc) AM_DEVREADWRITE("ppi", i8255_device, read, write)
100   AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0x0400) AM_RAM AM_SHARE("videoram")
101   AM_RANGE(0x5000, 0x50ff) AM_MIRROR(0x0700) AM_RAM AM_SHARE("objectram")
102   AM_RANGE(0x6800, 0x6807) AM_MIRROR(0x07f8) AM_WRITE(video_ctrl_w)
103   AM_RANGE(0x7000, 0x77ff) AM_READNOP //AFR - looks like a watchdog
104   AM_RANGE(0x8100, 0x8103) AM_MIRROR(0x7efc) AM_DEVREADWRITE("ppi", i8255_device, read, write)
74105ADDRESS_MAP_END
75106
76107static ADDRESS_MAP_START( audio1_map, AS_PROGRAM, 8, mrgame_state )
r31285r31286
80111
81112static ADDRESS_MAP_START( audio1_io, AS_IO, 8, mrgame_state )
82113   ADDRESS_MAP_GLOBAL_MASK(3)
83   AM_RANGE(0x0000, 0x0000) //AM_DEVWRITE("dac", dac_device, write_unsigned8) //DA1. The DC output might be an electronic volume control of the M114's output.
114   AM_RANGE(0x0000, 0x0000) AM_WRITENOP //AM_DEVWRITE("dac", dac_device, write_unsigned8) //DA1. The DC output might be an electronic volume control of the M114's output.
84115   AM_RANGE(0x0001, 0x0001) AM_READ(sound_r) //IN1
85116   AM_RANGE(0x0002, 0x0002) AM_WRITE(ack1_w) //AKL1
86117   AM_RANGE(0x0003, 0x0003) AM_WRITENOP //SGS pass data to M114
r31285r31286
105136   PORT_DIPNAME( 0x01, 0x00, "M01")
106137   PORT_DIPSETTING(    0x01, DEF_STR( Off ))
107138   PORT_DIPSETTING(    0x00, DEF_STR( On ))
108   PORT_DIPNAME( 0x02, 0x00, "M02")
139   PORT_DIPNAME( 0x02, 0x02, "M02")
109140   PORT_DIPSETTING(    0x02, DEF_STR( Off ))
110141   PORT_DIPSETTING(    0x00, DEF_STR( On ))
111   PORT_DIPNAME( 0x04, 0x00, "M03")
142   PORT_DIPNAME( 0x04, 0x04, "M03")
112143   PORT_DIPSETTING(    0x04, DEF_STR( Off ))
113144   PORT_DIPSETTING(    0x00, DEF_STR( On ))
114   PORT_DIPNAME( 0x08, 0x00, "M04")
145   PORT_DIPNAME( 0x08, 0x08, "M04")
115146   PORT_DIPSETTING(    0x08, DEF_STR( Off ))
116147   PORT_DIPSETTING(    0x00, DEF_STR( On ))
148
149   PORT_START("DSW1")
150   PORT_DIPNAME( 0x01, 0x00, "V01")
151   PORT_DIPSETTING(    0x01, DEF_STR( Off ))
152   PORT_DIPSETTING(    0x00, DEF_STR( On ))
153   PORT_DIPNAME( 0x02, 0x02, "V02")
154   PORT_DIPSETTING(    0x02, DEF_STR( Off ))
155   PORT_DIPSETTING(    0x00, DEF_STR( On ))
156   PORT_DIPNAME( 0x04, 0x04, "V03")
157   PORT_DIPSETTING(    0x04, DEF_STR( Off ))
158   PORT_DIPSETTING(    0x00, DEF_STR( On ))
159   PORT_DIPNAME( 0x08, 0x08, "V04")
160   PORT_DIPSETTING(    0x08, DEF_STR( Off ))
161   PORT_DIPSETTING(    0x00, DEF_STR( On ))
117162INPUT_PORTS_END
118163
119164READ8_MEMBER( mrgame_state::rsw_r )
r31285r31286
121166   return ioport("DSW0")->read() | ((UINT8)m_ack1 << 5) | ((UINT8)m_ack2 << 4);
122167}
123168
169// this is like a keyboard, energise a row and read the column data
170READ8_MEMBER( mrgame_state::col_r )
171{
172   if (m_row_data == 7)
173      return m_video_status;
174
175   return 0xff;
176}
177
178WRITE8_MEMBER( mrgame_state::row_w )
179{
180   m_row_data = data & 7;
181}
182
124183READ8_MEMBER( mrgame_state::sound_r )
125184{
126185   return m_sound_data;
r31285r31286
133192   m_audiocpu2->set_input_line(INPUT_LINE_NMI, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
134193}
135194
195// this produces 24 outputs from three driver chips to drive lamps & solenoids
196WRITE8_MEMBER( mrgame_state::triple_w )
197{
198   if ((data & 0x18)==0)
199      m_ackv = BIT(data, 7);
200}
201
202WRITE8_MEMBER( mrgame_state::video_w )
203{
204   m_video_data = data;
205}
206
207WRITE8_MEMBER( mrgame_state::video_ctrl_w )
208{
209   m_video_ctrl[offset] = data;
210
211   if (offset == 0)
212      m_gfx_bank = (m_gfx_bank & 6) | BIT(data, 0);
213   else
214   if (offset == 3)
215      m_gfx_bank = (m_gfx_bank & 5) | (BIT(data, 0) << 1);
216   else
217   if (offset == 4)
218      m_gfx_bank = (m_gfx_bank & 3) | (BIT(data, 0) << 2);
219}
220
136221WRITE8_MEMBER( mrgame_state::ack1_w )
137222{
138223   m_ack1 = BIT(data, 0);
r31285r31286
143228   m_ack2 = BIT(data, 0);
144229}
145230
231READ8_MEMBER( mrgame_state::porta_r )
232{
233   return m_video_data;
234}
235
236WRITE8_MEMBER( mrgame_state::portb_w )
237{
238   m_video_status = data;
239   m_ackv = 0;
240}
241
242READ8_MEMBER( mrgame_state::portc_r )
243{
244   return ioport("DSW1")->read() | ((UINT8)m_ackv << 4);
245}
246
146247void mrgame_state::machine_reset()
147248{
148249   m_sound_data = 0xff;
149250   m_irq_state = 0xff;
251   m_video_data = 0;
252   m_gfx_bank = 0;
253   m_video_status = 0;
254   m_ack1 = 0;
255   m_ack2 = 0;
256   m_ackv = 0;
257   m_row_data = 0;
258   m_p_chargen = memregion("chargen")->base();
150259}
151260
152261DRIVER_INIT_MEMBER( mrgame_state, mrgame )
r31285r31286
172281   }
173282}
174283
284// layouts from pinmame
285static const gfx_layout charlayout =
286{
287   8, 8,
288   4096,
289   2,
290   { 0, 0x8000*8 },
291   { 0, 1, 2, 3, 4, 5, 6, 7 },
292   { 0, 8, 16, 24, 32, 40, 48, 56 },
293   8*8
294};
295
296static const gfx_layout spritelayout =
297{
298   16, 16,
299   1024,
300   2,
301   { 0, 0x8000*8 },
302   { 0, 1, 2, 3, 4, 5, 6, 7, 64, 65, 66, 67, 68, 69, 70, 71 },
303   { 0, 8, 16, 24, 32, 40, 48, 56, 128, 136, 144, 152, 160, 168, 176, 184 },
304   32*8
305};
306
307static GFXDECODE_START( mrgame )
308   GFXDECODE_ENTRY( "chargen", 0, charlayout, 3, 1 )
309   GFXDECODE_ENTRY( "chargen", 0, spritelayout, 3, 1 )
310GFXDECODE_END
311
312// this gives bad colours although it looks right
313PALETTE_INIT_MEMBER( mrgame_state, mrgame)
314{
315   static const int resistances[3] = { 1000, 470, 220 };
316   double rweights[3], gweights[3], bweights[2];
317   UINT8 i, bit0, bit1, bit2, r, g, b;
318   const UINT8 *color_prom = machine().root_device().memregion("proms")->base();
319
320   /* compute the color output resistor weights */
321   compute_resistor_weights(0,   255, -1.0,
322         3, &resistances[0], rweights, 0, 0,
323         3, &resistances[0], gweights, 0, 0,
324         2, &resistances[1], bweights, 0, 0);
325
326   /* create a lookup table for the palette */
327   for (i = 0; i < 32; i++)
328   {
329      /* red component */
330      bit0 = BIT(color_prom[i], 0);
331      bit1 = BIT(color_prom[i], 1);
332      bit2 = BIT(color_prom[i], 2);
333      r = combine_3_weights(rweights, bit0, bit1, bit2);
334
335      /* green component */
336      bit0 = BIT(color_prom[i], 3);
337      bit1 = BIT(color_prom[i], 4);
338      bit2 = BIT(color_prom[i], 5);
339      g = combine_3_weights(gweights, bit0, bit1, bit2);
340
341      /* blue component */
342      bit0 = BIT(color_prom[i], 6);
343      bit1 = BIT(color_prom[i], 7);
344      b = combine_2_weights(bweights, bit0, bit1);
345
346      palette.set_pen_color(i, rgb_t(r, g, b));
347   }
348}
349
350// most of this came from pinmame as the diagram doesn't make a lot of sense
351UINT32 mrgame_state::screen_update_mrgame(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
352{
353   UINT8 y,ptr,col;
354   UINT16 sy=0,x,chr;
355   bool flipx,flipy;
356
357   // text
358   for (y = 0; y < 32; y++)
359   {
360      ptr = 1;
361      for (x = 0; x < 32; x++)
362      {
363         col = m_p_objectram[ptr];
364         ptr+=2;
365         chr = m_p_videoram[x+y*32] + (m_gfx_bank << 8);
366
367         m_gfxdecode->gfx(0)->opaque(bitmap,cliprect,
368            chr,
369            col,
370            0,0,
371            x*8,y*8);
372      }
373   }
374
375   // sprites
376   for (ptr = 0x40; ptr < 0x60; ptr += 4)
377   {
378      x = m_p_objectram[ptr + 3] + 1;
379      sy = 255 - m_p_objectram[ptr];
380      flipx = BIT(m_p_objectram[ptr + 1], 6);
381      flipy = BIT(m_p_objectram[ptr + 1], 7);
382      chr = (m_p_objectram[ptr + 1] & 0x3f) + (m_gfx_bank << 8);
383      col = m_p_objectram[ptr + 2];
384
385      if ((sy > 16) && (x > 24))
386         m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
387            chr,
388            col,
389            flipx,flipy,
390            x,sy-16,0);
391   }
392
393   return 0;
394}
395
175396static MACHINE_CONFIG_START( mrgame, mrgame_state )
176397   /* basic machine hardware */
177398   MCFG_CPU_ADD("maincpu", M68000, XTAL_6MHz)
178399   MCFG_CPU_PROGRAM_MAP(main_map)
400   MCFG_CPU_PERIODIC_INT_DRIVER(mrgame_state, irq1_line_hold, 183)
179401   MCFG_CPU_ADD("videocpu", Z80, XTAL_18_432MHz/6)
180402   MCFG_CPU_PROGRAM_MAP(video_map)
403   MCFG_CPU_VBLANK_INT_DRIVER("screen", mrgame_state, nmi_line_pulse)
181404   MCFG_CPU_ADD("audiocpu1", Z80, XTAL_4MHz)
182405   MCFG_CPU_PROGRAM_MAP(audio1_map)
183406   MCFG_CPU_IO_MAP(audio1_io)
r31285r31286
187410
188411   MCFG_NVRAM_ADD_0FILL("nvram")
189412
413   /* video hardware */
414   MCFG_SCREEN_ADD("screen", RASTER)
415   MCFG_SCREEN_REFRESH_RATE(50)
416   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
417   MCFG_SCREEN_SIZE(256, 256)
418   MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 247)
419   MCFG_SCREEN_UPDATE_DRIVER(mrgame_state, screen_update_mrgame)
420   MCFG_SCREEN_PALETTE("palette")
421   MCFG_PALETTE_ADD_INIT_BLACK("palette", 32)
422   MCFG_PALETTE_INIT_OWNER(mrgame_state, mrgame)
423   MCFG_GFXDECODE_ADD("gfxdecode", "palette", mrgame)
424
425   /* Sound */
190426   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
191427   MCFG_DAC_ADD("dacl")
192428   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
r31285r31286
197433   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
198434   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
199435
200   MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", mrgame_state, irq_timer, attotime::from_hz(16000)) //
436   /* Devices */
437   MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", mrgame_state, irq_timer, attotime::from_hz(16000)) //ugh
201438   MCFG_DEVICE_ADD("ppi", I8255A, 0)
439   MCFG_I8255_IN_PORTA_CB(READ8(mrgame_state, porta_r))
440   MCFG_I8255_OUT_PORTB_CB(WRITE8(mrgame_state, portb_w))
441   MCFG_I8255_IN_PORTC_CB(READ8(mrgame_state, portc_r))
202442MACHINE_CONFIG_END
203443
204444/*-------------------------------------------------------------------
r31285r31286
212452   ROM_REGION(0x10000, "video", 0)
213453   ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(88a9ca81) SHA1(9660d416b2b8f1937cda7bca51bd287641c7730c))
214454
215   ROM_REGION( 0x10000, "gfx1", 0 )
455   ROM_REGION( 0x10000, "chargen", 0 )
216456   ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(3c68b448) SHA1(f416f00d2de0c71c021fec0e9702ba79b761d5e7))
217457   ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(0aac43e9) SHA1(28edfeddb2d54e40425488bad37e3819e4488b0b))
218458
r31285r31286
242482   ROM_REGION(0x10000, "video", 0)
243483   ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97))
244484
245   ROM_REGION( 0x10000, "gfx1", 0 )
485   ROM_REGION( 0x10000, "chargen", 0 )
246486   ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db))
247487   ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737))
248488
r31285r31286
268508   ROM_REGION(0x10000, "video", 0)
269509   ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97))
270510
271   ROM_REGION( 0x10000, "gfx1", 0 )
511   ROM_REGION( 0x10000, "chargen", 0 )
272512   ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db))
273513   ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737))
274514
r31285r31286
297537   ROM_REGION(0x10000, "video", 0)
298538   ROM_LOAD("vid_ic91.rom", 0x00000, 0x8000, CRC(42d2ba01) SHA1(c13d38c2798575760461912cef65dde57dfd938c))
299539
300   ROM_REGION( 0x30000, "gfx1", 0 )
540   ROM_REGION( 0x30000, "chargen", 0 )
301541   ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(f6e047fb) SHA1(6be712dda60257b9e7014315c8fee19812622bf6))
302542   ROM_LOAD("vid_ic15.rom", 0x08000, 0x8000, CRC(405a8f54) SHA1(4d58915763db3c3be2bfc166be1a12285ff2c38b))
303543   ROM_LOAD("vid_ic16.rom", 0x10000, 0x8000, CRC(063ea783) SHA1(385dbfcc8ecd3a784f9a8752d00e060b48d70d6a))
r31285r31286
329569   ROM_REGION(0x10000, "video", 0)
330570   ROM_LOAD("vid_ic91.rom", 0x00000, 0x8000, CRC(3287ad20) SHA1(d5a453efc7292670073f157dca04897be857b8ed))
331571
332   ROM_REGION( 0x30000, "gfx1", 0 )
572   ROM_REGION( 0x30000, "chargen", 0 )
333573   ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(a101d562) SHA1(ad9ad3968f13169572ec60e22e84acf43382b51e))
334574   ROM_LOAD("vid_ic15.rom", 0x08000, 0x8000, CRC(40791e7a) SHA1(788760b8527df48d1825be88099491b6e94f0a19))
335575   ROM_LOAD("vid_ic16.rom", 0x10000, 0x8000, CRC(a7214157) SHA1(a4660180e8491a37028fec8533cf13daf839a7c4))

Previous 199869 Revisions Next


© 1997-2024 The MAME Team