~ubuntu-branches/debian/sid/mame/sid

« back to all changes in this revision

Viewing changes to src/mame/drivers/galpani2.c

  • Committer: Bazaar Package Importer
  • Author(s): Jordi Mallach, Emmanuel Kasper, Félix Arreola Rodríguez, Jordi Mallach
  • Date: 2011-05-11 21:06:50 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20110511210650-jizvh8a6x117y9hr
Tags: 0.142-1
[ Emmanuel Kasper ]
* New upstream release
* Set NOWERROR=1 to allow compiling with gcc-4.6
* Remove fix_powerpc_build.patch, as upstream has taken it in this release
* Add gnome-video-arcade front end as a suggested package

[ Félix Arreola Rodríguez ]
* Add kfreebsd-build.patch to quilt series, to fix build on kfreebsd

[ Jordi Mallach ]
* Remove unneeded and bogus addition of --with-quilt to the dh invocation.
* Add Cesare Falco (long time Ubuntu maintainer) to Uploaders, and wrap
  them into multiple lines.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
#include "emu.h"
23
23
#include "cpu/m68000/m68000.h"
 
24
#include "sound/okim6295.h"
24
25
#include "deprecat.h"
25
26
#include "machine/eeprom.h"
26
27
#include "includes/kaneko16.h"
27
 
#include "sound/okim6295.h"
 
28
#include "includes/galpani2.h"
28
29
 
29
30
/***************************************************************************
30
31
 
34
35
 
35
36
***************************************************************************/
36
37
 
37
 
static UINT16 eeprom_word;
38
38
static READ16_DEVICE_HANDLER(galpani2_eeprom_r)
39
39
{
40
 
        return (eeprom_word & ~1) | (eeprom_read_bit(device) & 1);
 
40
        galpani2_state *state = device->machine().driver_data<galpani2_state>();
 
41
        return (state->m_eeprom_word & ~1) | (eeprom_read_bit(device) & 1);
41
42
}
42
43
 
43
44
static WRITE16_DEVICE_HANDLER(galpani2_eeprom_w)
44
45
{
45
 
        COMBINE_DATA( &eeprom_word );
 
46
        galpani2_state *state = device->machine().driver_data<galpani2_state>();
 
47
        COMBINE_DATA( &state->m_eeprom_word );
46
48
        if ( ACCESSING_BITS_0_7 )
47
49
        {
48
50
                // latch the bit
67
69
 
68
70
***************************************************************************/
69
71
 
70
 
static UINT16 *galpani2_ram, *galpani2_ram2;
71
72
 
72
73
static MACHINE_RESET( galpani2 )
73
74
{
77
78
 
78
79
        kaneko16_sprite_xoffs = 0x10000 - 0x16c0 + 0xc00;
79
80
        kaneko16_sprite_yoffs = 0x000;
80
 
        cpuexec_boost_interleave(machine, attotime_zero, ATTOTIME_IN_USEC(50)); //initial mcu xchk
 
81
        machine.scheduler().boost_interleave(attotime::zero, attotime::from_usec(50)); //initial mcu xchk
81
82
}
82
83
 
83
84
static void galpani2_write_kaneko(device_t *device)
84
85
{
85
 
        address_space *dstspace = cpu_get_address_space(device, ADDRESS_SPACE_PROGRAM);
 
86
        address_space *dstspace = device->memory().space(AS_PROGRAM);
86
87
        int i,x,tpattidx;
87
88
        unsigned char testpattern[] = {0xFF,0x55,0xAA,0xDD,0xBB,0x99};
88
89
 
111
112
 
112
113
static WRITE8_HANDLER( galpani2_mcu_init_w )
113
114
{
114
 
        running_machine *machine = space->machine;
115
 
        address_space *srcspace = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
116
 
        address_space *dstspace = cputag_get_address_space(machine, "sub", ADDRESS_SPACE_PROGRAM);
 
115
        running_machine &machine = space->machine();
 
116
        address_space *srcspace = machine.device("maincpu")->memory().space(AS_PROGRAM);
 
117
        address_space *dstspace = machine.device("sub")->memory().space(AS_PROGRAM);
117
118
        UINT32 mcu_address, mcu_data;
118
119
 
119
120
        for ( mcu_address = 0x100010; mcu_address < (0x100010 + 6); mcu_address += 1 )
124
125
        cputag_set_input_line(machine, "sub", INPUT_LINE_IRQ7, HOLD_LINE); //MCU Initialised
125
126
}
126
127
 
127
 
static void galpani2_mcu_nmi1(running_machine *machine)
 
128
static void galpani2_mcu_nmi1(running_machine &machine)
128
129
{
129
 
        address_space *srcspace = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
130
 
        address_space *dstspace = cputag_get_address_space(machine, "sub", ADDRESS_SPACE_PROGRAM);
 
130
        address_space *srcspace = machine.device("maincpu")->memory().space(AS_PROGRAM);
 
131
        address_space *dstspace = machine.device("sub")->memory().space(AS_PROGRAM);
131
132
        UINT32 mcu_list, mcu_command, mcu_address, mcu_extra, mcu_src, mcu_dst, mcu_size;
132
133
 
133
134
        for ( mcu_list = 0x100021; mcu_list < (0x100021 + 0x40); mcu_list += 4 )
143
144
                if (mcu_command != 0)
144
145
                {
145
146
                        logerror("%s : MCU [$%06X] endidx = $%02X / command = $%02X addr = $%04X ? = $%02X.\n",
146
 
                        cpuexec_describe_context(machine),
 
147
                        machine.describe_context(),
147
148
                        mcu_list,
148
149
                        srcspace->read_byte(0x100020),
149
150
                        mcu_command,
166
167
 
167
168
                        mcu_size        =       (srcspace->read_byte(mcu_address + 8)<<8) +
168
169
                                                        (srcspace->read_byte(mcu_address + 9)<<0) ;
169
 
                        logerror("%s : MCU executes command $%02X, %04X %02X-> %04x\n",cpuexec_describe_context(machine),mcu_command,mcu_src,mcu_size,mcu_dst);
 
170
                        logerror("%s : MCU executes command $%02X, %04X %02X-> %04x\n",machine.describe_context(),mcu_command,mcu_src,mcu_size,mcu_dst);
170
171
 
171
172
                        for( ; mcu_size > 0 ; mcu_size-- )
172
173
                        {
191
192
                        mcu_size        =       (srcspace->read_byte(mcu_address + 8)<<8) +
192
193
                                                        (srcspace->read_byte(mcu_address + 9)<<0) ;
193
194
 
194
 
                        logerror("%s : MCU executes command $%02X, %04X %02X-> %04x\n",cpuexec_describe_context(machine),mcu_command,mcu_src,mcu_size,mcu_dst);
 
195
                        logerror("%s : MCU executes command $%02X, %04X %02X-> %04x\n",machine.describe_context(),mcu_command,mcu_src,mcu_size,mcu_dst);
195
196
 
196
197
                        for( ; mcu_size > 0 ; mcu_size-- )
197
198
                        {
219
220
                        srcspace->write_byte(mcu_address+0,0xff);
220
221
                        srcspace->write_byte(mcu_address+1,0xff);
221
222
 
222
 
                        logerror("%s : MCU ERROR, unknown command $%02X\n",cpuexec_describe_context(machine),mcu_command);
 
223
                        logerror("%s : MCU ERROR, unknown command $%02X\n",machine.describe_context(),mcu_command);
223
224
                }
224
225
 
225
226
                /* Erase command (so that it won't be processed again)? */
227
228
        }
228
229
}
229
230
 
230
 
static void galpani2_mcu_nmi2(running_machine *machine)
 
231
static void galpani2_mcu_nmi2(running_machine &machine)
231
232
{
232
 
                galpani2_write_kaneko(machine->device("maincpu"));
233
 
                //logerror("%s : MCU executes CHECKs synchro\n", cpuexec_describe_context(machine));
 
233
                galpani2_write_kaneko(machine.device("maincpu"));
 
234
                //logerror("%s : MCU executes CHECKs synchro\n", machine.describe_context());
234
235
}
235
236
 
236
237
static WRITE8_HANDLER( galpani2_mcu_nmi1_w ) //driven by CPU1's int5 ISR
237
238
{
 
239
        galpani2_state *state = space->machine().driver_data<galpani2_state>();
238
240
//for galpan2t:
239
241
//Triggered from 'maincpu' (00007D60),once, with no command, using alternate line, during init
240
242
//Triggered from 'maincpu' (000080BE),once, for unknown command, during init
241
243
//Triggered from 'maincpu' (0000741E),from here on...driven by int5, even if there's no command
242
 
        static UINT16 old_mcu_nmi1 = 0;
243
 
        if ( (data & 1) && !(old_mcu_nmi1 & 1) )        galpani2_mcu_nmi1(space->machine);
244
 
        //if ( (data & 0x10) && !(old_mcu_nmi1 & 0x10) )    galpani2_mcu_nmi1(space->machine);
 
244
        if ( (data & 1) && !(state->m_old_mcu_nmi1 & 1) )       galpani2_mcu_nmi1(space->machine());
 
245
        //if ( (data & 0x10) && !(state->m_old_mcu_nmi1 & 0x10) )    galpani2_mcu_nmi1(space->machine());
245
246
        //alternate line, same function?
246
 
        old_mcu_nmi1 = data;
 
247
        state->m_old_mcu_nmi1 = data;
247
248
}
248
249
 
249
250
static WRITE8_HANDLER( galpani2_mcu_nmi2_w ) //driven by CPU2's int5 ISR
250
251
{
251
 
        static UINT16 old_mcu_nmi2 = 0;
252
 
        if ( (data & 1) && !(old_mcu_nmi2 & 1) )        galpani2_mcu_nmi2(space->machine);
253
 
        old_mcu_nmi2 = data;
 
252
        galpani2_state *state = space->machine().driver_data<galpani2_state>();
 
253
        if ( (data & 1) && !(state->m_old_mcu_nmi2 & 1) )       galpani2_mcu_nmi2(space->machine());
 
254
        state->m_old_mcu_nmi2 = data;
254
255
}
255
256
 
256
257
 
264
265
 
265
266
static WRITE8_HANDLER( galpani2_coin_lockout_w )
266
267
{
267
 
                coin_counter_w(space->machine, 0, data & 0x01);
268
 
                coin_counter_w(space->machine, 1, data & 0x02);
269
 
                coin_lockout_w(space->machine, 0,~data & 0x04);
270
 
                coin_lockout_w(space->machine, 1,~data & 0x08);
 
268
                coin_counter_w(space->machine(), 0, data & 0x01);
 
269
                coin_counter_w(space->machine(), 1, data & 0x02);
 
270
                coin_lockout_w(space->machine(), 0,~data & 0x04);
 
271
                coin_lockout_w(space->machine(), 1,~data & 0x08);
271
272
                // & 0x10     CARD in lockout?
272
273
                // & 0x20     CARD in lockout?
273
274
                // & 0x40     CARD out
275
276
 
276
277
static WRITE8_DEVICE_HANDLER( galpani2_oki1_bank_w )
277
278
{
278
 
                UINT8 *ROM = device->machine->region("oki1")->base();
279
 
                logerror("%s : %s bank %08X\n",cpuexec_describe_context(device->machine),device->tag(),data);
280
 
                memcpy(ROM + 0x30000, ROM + 0x40000 + 0x10000 * (~data & 0xf), 0x10000);
 
279
        UINT8 *ROM = device->machine().region("oki1")->base();
 
280
        logerror("%s : %s bank %08X\n",device->machine().describe_context(),device->tag(),data);
 
281
        memcpy(ROM + 0x30000, ROM + 0x40000 + 0x10000 * (~data & 0xf), 0x10000);
281
282
}
282
283
 
283
284
static WRITE8_DEVICE_HANDLER( galpani2_oki2_bank_w )
284
285
{
285
 
                okim6295_device *oki = downcast<okim6295_device *>(device);
286
 
                oki->set_bank_base(0x40000 * (data & 0xf) );
287
 
                logerror("%s : %s bank %08X\n",cpuexec_describe_context(device->machine),device->tag(),data);
 
286
        okim6295_device *oki = downcast<okim6295_device *>(device);
 
287
        oki->set_bank_base(0x40000 * (data & 0xf) );
 
288
        logerror("%s : %s bank %08X\n",device->machine().describe_context(),device->tag(),data);
288
289
}
289
290
 
290
291
 
291
 
static ADDRESS_MAP_START( galpani2_mem1, ADDRESS_SPACE_PROGRAM, 16 )
 
292
static ADDRESS_MAP_START( galpani2_mem1, AS_PROGRAM, 16 )
292
293
        AM_RANGE(0x000000, 0x0fffff) AM_ROM                                                                                             // ROM
293
 
        AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE(&galpani2_ram                               )               // Work RAM
 
294
        AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE_MEMBER(galpani2_state, m_ram)               // Work RAM
294
295
        AM_RANGE(0x110000, 0x11000f) AM_RAM                                                                                             // ? corrupted? stack dumper on POST failure, pc+sr on gp2se
295
296
        AM_RANGE(0x300000, 0x301fff) AM_RAM                                                                                             // ?
296
297
        AM_RANGE(0x302000, 0x303fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)     // Sprites
297
298
        AM_RANGE(0x304000, 0x30401f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_BASE(&kaneko16_sprites_regs       )       // Sprites Regs
298
299
        AM_RANGE(0x308000, 0x308001) AM_WRITENOP                                                                                // ? 0 at startup
299
300
        AM_RANGE(0x30c000, 0x30c001) AM_WRITENOP                                                                                // ? hblank effect ?
300
 
        AM_RANGE(0x310000, 0x3101ff) AM_RAM_WRITE(galpani2_palette_0_w) AM_BASE(&galpani2_palette_0     )       // ?
 
301
        AM_RANGE(0x310000, 0x3101ff) AM_RAM_WRITE(galpani2_palette_0_w) AM_BASE_MEMBER(galpani2_state, m_palette_0)     // ?
301
302
        AM_RANGE(0x314000, 0x314001) AM_WRITENOP                                                                                // ? flip backgrounds ?
302
303
        AM_RANGE(0x318000, 0x318001) AM_DEVREADWRITE("eeprom", galpani2_eeprom_r, galpani2_eeprom_w)    // EEPROM
303
304
        AM_RANGE(0x380000, 0x387fff) AM_RAM                                                                                             // Palette?
304
305
        AM_RANGE(0x388000, 0x38ffff) AM_RAM_WRITE(paletteram16_xGGGGGRRRRRBBBBB_word_w) AM_BASE_GENERIC(paletteram      )       // Palette
305
306
        AM_RANGE(0x390000, 0x3901ff) AM_WRITENOP                                                                                // ? at startup of service mode
306
307
 
307
 
        AM_RANGE(0x400000, 0x43ffff) AM_RAM_WRITE(galpani2_bg8_0_w) AM_BASE(&galpani2_bg8_0     )       // Background 0
308
 
        AM_RANGE(0x440000, 0x440001) AM_RAM AM_BASE(&galpani2_bg8_0_scrollx     )                       // Background 0 Scroll X
309
 
        AM_RANGE(0x480000, 0x480001) AM_RAM AM_BASE(&galpani2_bg8_0_scrolly     )                       // Background 0 Scroll Y
 
308
        AM_RANGE(0x400000, 0x43ffff) AM_RAM_WRITE(galpani2_bg8_0_w) AM_BASE_MEMBER(galpani2_state, m_bg8_0)     // Background 0
 
309
        AM_RANGE(0x440000, 0x440001) AM_RAM AM_BASE_MEMBER(galpani2_state, m_bg8_0_scrollx)                     // Background 0 Scroll X
 
310
        AM_RANGE(0x480000, 0x480001) AM_RAM AM_BASE_MEMBER(galpani2_state, m_bg8_0_scrolly)                     // Background 0 Scroll Y
310
311
        AM_RANGE(0x4c0000, 0x4c0001) AM_WRITENOP                                                                                // ? 0 at startup only
311
 
        AM_RANGE(0x500000, 0x53ffff) AM_RAM_WRITE(galpani2_bg8_1_w) AM_BASE(&galpani2_bg8_1     )       // Background 1
312
 
        AM_RANGE(0x540000, 0x540001) AM_RAM AM_BASE(&galpani2_bg8_1_scrollx     )                       // Background 1 Scroll X
 
312
        AM_RANGE(0x500000, 0x53ffff) AM_RAM_WRITE(galpani2_bg8_1_w) AM_BASE_MEMBER(galpani2_state, m_bg8_1)     // Background 1
 
313
        AM_RANGE(0x540000, 0x540001) AM_RAM AM_BASE_MEMBER(galpani2_state, m_bg8_1_scrollx)                     // Background 1 Scroll X
313
314
 
314
315
        AM_RANGE(0x540572, 0x540573) AM_READNOP                                                                                 // ? galpani2 at F0A4
315
316
        AM_RANGE(0x54057a, 0x54057b) AM_READNOP                                                                                 // ? galpani2 at F148
321
322
        AM_RANGE(0x5405c2, 0x5405c3) AM_READNOP                                                                                 // ? galpani2 at F0A4 and F148
322
323
        AM_RANGE(0x5405ca, 0x5405cb) AM_READNOP                                                                                 // ? galpani2 at F148
323
324
 
324
 
        AM_RANGE(0x580000, 0x580001) AM_RAM AM_BASE(&galpani2_bg8_1_scrolly     )                       // Background 1 Scroll Y
 
325
        AM_RANGE(0x580000, 0x580001) AM_RAM AM_BASE_MEMBER(galpani2_state, m_bg8_1_scrolly)                     // Background 1 Scroll Y
325
326
        AM_RANGE(0x5c0000, 0x5c0001) AM_WRITENOP                                                                                // ? 0 at startup only
326
327
        AM_RANGE(0x600000, 0x600001) AM_WRITENOP                                                                                // Watchdog
327
328
        AM_RANGE(0x640000, 0x640001) AM_WRITE8(galpani2_mcu_init_w, 0x00ff                      )       // ? 0 before resetting and at startup, Reset mcu ?
346
347
 
347
348
***************************************************************************/
348
349
 
349
 
static UINT16 *galpani2_rombank;
350
350
 
351
351
static READ16_HANDLER( galpani2_bankedrom_r )
352
352
{
353
 
        UINT16 *ROM = (UINT16 *) space->machine->region( "user1" )->base();
354
 
        size_t    len = space->machine->region( "user1" )->bytes() / 2;
 
353
        galpani2_state *state = space->machine().driver_data<galpani2_state>();
 
354
        UINT16 *ROM = (UINT16 *) space->machine().region( "user1" )->base();
 
355
        size_t    len = space->machine().region( "user1" )->bytes() / 2;
355
356
 
356
 
        offset += (0x800000/2) * (*galpani2_rombank & 0x0003);
 
357
        offset += (0x800000/2) * (*state->m_rombank & 0x0003);
357
358
 
358
359
        if ( offset < len )     return ROM[offset];
359
360
        else                            return 0xffff; //floating bus for absent ROMs
360
361
}
361
362
 
362
 
static ADDRESS_MAP_START( galpani2_mem2, ADDRESS_SPACE_PROGRAM, 16 )
 
363
static ADDRESS_MAP_START( galpani2_mem2, AS_PROGRAM, 16 )
363
364
        AM_RANGE(0x000000, 0x03ffff) AM_ROM                                                                                                                             // ROM
364
 
        AM_RANGE(0x100000, 0x13ffff) AM_RAM AM_BASE(&galpani2_ram2)                                                                             // Work RAM
365
 
        AM_RANGE(0x400000, 0x4fffff) AM_RAM_WRITE(galpani2_bg15_w) AM_BASE(&galpani2_bg15)      // bg15
 
365
        AM_RANGE(0x100000, 0x13ffff) AM_RAM AM_BASE_MEMBER(galpani2_state, m_ram2)                                                                              // Work RAM
 
366
        AM_RANGE(0x400000, 0x4fffff) AM_RAM_WRITE(galpani2_bg15_w) AM_BASE_MEMBER(galpani2_state, m_bg15)       // bg15
366
367
        AM_RANGE(0x500000, 0x5fffff) AM_RAM                                                                                                                             // bg15
367
368
        AM_RANGE(0x600000, 0x600001) AM_NOP     // ? 0 at startup only
368
369
        AM_RANGE(0x640000, 0x640001) AM_WRITENOP                                                                // ? 0 at startup only
371
372
        AM_RANGE(0x700000, 0x700001) AM_WRITENOP                                                                // Watchdog
372
373
//  AM_RANGE(0x740000, 0x740001) AM_WRITENOP                                // ? Reset mcu
373
374
        AM_RANGE(0x780000, 0x780001) AM_WRITE8(galpani2_mcu_nmi2_w, 0x00ff)                             // ? 0 -> 1 -> 0 (lev 5)
374
 
        AM_RANGE(0x7c0000, 0x7c0001) AM_WRITEONLY AM_BASE(&galpani2_rombank     )       // Rom Bank
 
375
        AM_RANGE(0x7c0000, 0x7c0001) AM_WRITEONLY AM_BASE_MEMBER(galpani2_state, m_rombank)     // Rom Bank
375
376
        AM_RANGE(0x800000, 0xffffff) AM_READ(galpani2_bankedrom_r               )               // Banked ROM
376
377
ADDRESS_MAP_END
377
378
 
555
556
{
556
557
        switch ( cpu_getiloops(device) )
557
558
        {
558
 
                case 3:  cpu_set_input_line(device, 3, HOLD_LINE); break;
559
 
                case 2:  cpu_set_input_line(device, 4, HOLD_LINE); break;
560
 
                case 1:  cpu_set_input_line(device, 5, HOLD_LINE); break;       // vblank?
561
 
                case 0:  cpu_set_input_line(device, 6, HOLD_LINE); break;       // hblank?
 
559
                case 3:  device_set_input_line(device, 3, HOLD_LINE); break;
 
560
                case 2:  device_set_input_line(device, 4, HOLD_LINE); break;
 
561
                case 1:  device_set_input_line(device, 5, HOLD_LINE); break;    // vblank?
 
562
                case 0:  device_set_input_line(device, 6, HOLD_LINE); break;    // hblank?
562
563
        }
563
564
}
564
565
 
568
569
{
569
570
        switch ( cpu_getiloops(device) )
570
571
        {
571
 
                case 2:  cpu_set_input_line(device, 3, HOLD_LINE); break;
572
 
                case 1:  cpu_set_input_line(device, 4, HOLD_LINE); break;
573
 
                case 0:  cpu_set_input_line(device, 5, HOLD_LINE); break;
 
572
                case 2:  device_set_input_line(device, 3, HOLD_LINE); break;
 
573
                case 1:  device_set_input_line(device, 4, HOLD_LINE); break;
 
574
                case 0:  device_set_input_line(device, 5, HOLD_LINE); break;
574
575
        }
575
576
}
576
577
 
577
 
static MACHINE_CONFIG_START( galpani2, driver_device )
 
578
static MACHINE_CONFIG_START( galpani2, galpani2_state )
578
579
 
579
580
        /* basic machine hardware */
580
581
        MCFG_CPU_ADD("maincpu", M68000, XTAL_27MHz/2)           /* Confirmed on galpani2i PCB */
596
597
        MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
597
598
        MCFG_SCREEN_SIZE(320, 256)
598
599
        MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1-16)
 
600
        MCFG_SCREEN_UPDATE(galpani2)
599
601
 
600
602
        MCFG_GFXDECODE(galpani2)
601
603
        MCFG_PALETTE_LENGTH(0x4000 + 0x200 + 0x8000)    // sprites, bg8, bg15
602
604
 
603
605
        MCFG_PALETTE_INIT(galpani2)
604
606
        MCFG_VIDEO_START(galpani2)
605
 
        MCFG_VIDEO_UPDATE(galpani2)
606
607
 
607
608
        /* sound hardware */
608
609
        MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")