195
195
device_set_input_line(device, 4, HOLD_LINE);
198
static CUSTOM_INPUT( system_port_r )
198
CUSTOM_INPUT_MEMBER(psikyo4_state::system_port_r)
200
return input_port_read(field.machine(), "SYSTEM");
200
return ioport("SYSTEM")->read();
203
static CUSTOM_INPUT( mahjong_ctrl_r ) /* used by hotgmck/hgkairak */
203
CUSTOM_INPUT_MEMBER(psikyo4_state::mahjong_ctrl_r)/* used by hotgmck/hgkairak */
205
psikyo4_state *state = field.machine().driver_data<psikyo4_state>();
206
205
int player = (FPTR)param;
207
int sel = (state->m_io_select[0] & 0x0000ff00) >> 8;
206
int sel = (m_io_select[0] & 0x0000ff00) >> 8;
210
if (sel & 1) ret &= input_port_read(field.machine(), player ? "KEY4" : "KEY0" );
211
if (sel & 2) ret &= input_port_read(field.machine(), player ? "KEY5" : "KEY1" );
212
if (sel & 4) ret &= input_port_read(field.machine(), player ? "KEY6" : "KEY2" );
213
if (sel & 8) ret &= input_port_read(field.machine(), player ? "KEY7" : "KEY3" );
209
if (sel & 1) ret &= ioport(player ? "KEY4" : "KEY0" )->read();
210
if (sel & 2) ret &= ioport(player ? "KEY5" : "KEY1" )->read();
211
if (sel & 4) ret &= ioport(player ? "KEY6" : "KEY2" )->read();
212
if (sel & 8) ret &= ioport(player ? "KEY7" : "KEY3" )->read();
218
static WRITE32_HANDLER( ps4_paletteram32_RRRRRRRRGGGGGGGGBBBBBBBBxxxxxxxx_dword_w )
220
psikyo4_state *state = space->machine().driver_data<psikyo4_state>();
222
COMBINE_DATA(&state->m_paletteram[offset]);
224
b = ((state->m_paletteram[offset] & 0x0000ff00) >> 8);
225
g = ((state->m_paletteram[offset] & 0x00ff0000) >> 16);
226
r = ((state->m_paletteram[offset] & 0xff000000) >> 24);
228
palette_set_color(space->machine(), offset, MAKE_RGB(r, g, b));
229
palette_set_color(space->machine(), offset + 0x800, MAKE_RGB(r, g, b)); // For screen 2
232
static WRITE32_HANDLER( ps4_bgpen_1_dword_w )
234
psikyo4_state *state = space->machine().driver_data<psikyo4_state>();
236
COMBINE_DATA(&state->m_bgpen_1[0]);
238
b = ((state->m_bgpen_1[0] & 0x0000ff00) >>8);
239
g = ((state->m_bgpen_1[0] & 0x00ff0000) >>16);
240
r = ((state->m_bgpen_1[0] & 0xff000000) >>24);
242
palette_set_color(space->machine(), 0x1000, MAKE_RGB(r, g, b)); // Clear colour for screen 1
245
static WRITE32_HANDLER( ps4_bgpen_2_dword_w )
247
psikyo4_state *state = space->machine().driver_data<psikyo4_state>();
249
COMBINE_DATA(&state->m_bgpen_2[0]);
251
b = ((state->m_bgpen_2[0] & 0x0000ff00) >>8);
252
g = ((state->m_bgpen_2[0] & 0x00ff0000) >>16);
253
r = ((state->m_bgpen_2[0] & 0xff000000) >>24);
255
palette_set_color(space->machine(), 0x1001, MAKE_RGB(r, g, b)); // Clear colour for screen 2
258
static WRITE32_HANDLER( ps4_screen1_brt_w )
260
psikyo4_state *state = space->machine().driver_data<psikyo4_state>();
217
WRITE32_MEMBER(psikyo4_state::ps4_paletteram32_RRRRRRRRGGGGGGGGBBBBBBBBxxxxxxxx_dword_w)
220
COMBINE_DATA(&m_paletteram[offset]);
222
b = ((m_paletteram[offset] & 0x0000ff00) >> 8);
223
g = ((m_paletteram[offset] & 0x00ff0000) >> 16);
224
r = ((m_paletteram[offset] & 0xff000000) >> 24);
226
palette_set_color(machine(), offset, MAKE_RGB(r, g, b));
227
palette_set_color(machine(), offset + 0x800, MAKE_RGB(r, g, b)); // For screen 2
230
WRITE32_MEMBER(psikyo4_state::ps4_bgpen_1_dword_w)
233
COMBINE_DATA(&m_bgpen_1[0]);
235
b = ((m_bgpen_1[0] & 0x0000ff00) >>8);
236
g = ((m_bgpen_1[0] & 0x00ff0000) >>16);
237
r = ((m_bgpen_1[0] & 0xff000000) >>24);
239
palette_set_color(machine(), 0x1000, MAKE_RGB(r, g, b)); // Clear colour for screen 1
242
WRITE32_MEMBER(psikyo4_state::ps4_bgpen_2_dword_w)
245
COMBINE_DATA(&m_bgpen_2[0]);
247
b = ((m_bgpen_2[0] & 0x0000ff00) >>8);
248
g = ((m_bgpen_2[0] & 0x00ff0000) >>16);
249
r = ((m_bgpen_2[0] & 0xff000000) >>24);
251
palette_set_color(machine(), 0x1001, MAKE_RGB(r, g, b)); // Clear colour for screen 2
254
WRITE32_MEMBER(psikyo4_state::ps4_screen1_brt_w)
262
257
if (ACCESSING_BITS_0_7)
321
static WRITE32_HANDLER( ps4_vidregs_w )
315
WRITE32_MEMBER(psikyo4_state::ps4_vidregs_w)
323
psikyo4_state *state = space->machine().driver_data<psikyo4_state>();
324
COMBINE_DATA(&state->m_vidregs[offset]);
317
COMBINE_DATA(&m_vidregs[offset]);
326
319
if (offset == 2) /* Configure bank for gfx test */
328
321
if (ACCESSING_BITS_0_15) // Bank
329
memory_set_bankptr(space->machine(), "bank2", space->machine().region("gfx1")->base() + 0x2000 * (state->m_vidregs[offset] & 0x1fff)); /* Bank comes from vidregs */
322
membank("bank2")->set_base(machine().root_device().memregion("gfx1")->base() + 0x2000 * (m_vidregs[offset] & 0x1fff)); /* Bank comes from vidregs */
333
#define PCM_BANK_NO(n) ((state->m_io_select[0] >> (n * 4 + 24)) & 0x07)
326
#define PCM_BANK_NO_LEGACY(n) ((state->m_io_select[0] >> (n * 4 + 24)) & 0x07)
335
328
static void set_hotgmck_pcm_bank( running_machine &machine, int n )
337
330
psikyo4_state *state = machine.driver_data<psikyo4_state>();
338
UINT8 *ymf_pcmbank = machine.region("ymf")->base() + 0x200000;
339
UINT8 *pcm_rom = machine.region("ymfsource")->base();
331
UINT8 *ymf_pcmbank = state->memregion("ymf")->base() + 0x200000;
332
UINT8 *pcm_rom = state->memregion("ymfsource")->base();
341
memcpy(ymf_pcmbank + n * 0x100000, pcm_rom + PCM_BANK_NO(n) * 0x100000, 0x100000);
334
memcpy(ymf_pcmbank + n * 0x100000, pcm_rom + PCM_BANK_NO_LEGACY(n) * 0x100000, 0x100000);
344
static WRITE32_HANDLER( hotgmck_pcm_bank_w )
336
#define PCM_BANK_NO(n) ((m_io_select[0] >> (n * 4 + 24)) & 0x07)
337
WRITE32_MEMBER(psikyo4_state::hotgmck_pcm_bank_w)
346
psikyo4_state *state = space->machine().driver_data<psikyo4_state>();
347
339
int old_bank0 = PCM_BANK_NO(0);
348
340
int old_bank1 = PCM_BANK_NO(1);
349
341
int new_bank0, new_bank1;
351
COMBINE_DATA(&state->m_io_select[0]);
343
COMBINE_DATA(&m_io_select[0]);
353
345
new_bank0 = PCM_BANK_NO(0);
354
346
new_bank1 = PCM_BANK_NO(1);
356
348
if (old_bank0 != new_bank0)
357
set_hotgmck_pcm_bank(space->machine(), 0);
349
set_hotgmck_pcm_bank(machine(), 0);
359
351
if (old_bank1 != new_bank1)
360
set_hotgmck_pcm_bank(space->machine(), 1);
352
set_hotgmck_pcm_bank(machine(), 1);
363
static ADDRESS_MAP_START( ps4_map, AS_PROGRAM, 32 )
355
static ADDRESS_MAP_START( ps4_map, AS_PROGRAM, 32, psikyo4_state )
364
356
AM_RANGE(0x00000000, 0x000fffff) AM_ROM // program ROM (1 meg)
365
357
AM_RANGE(0x02000000, 0x021fffff) AM_ROMBANK("bank1") // data ROM
366
AM_RANGE(0x03000000, 0x030037ff) AM_RAM AM_BASE_SIZE_MEMBER(psikyo4_state, m_spriteram, m_spriteram_size)
367
AM_RANGE(0x03003fe0, 0x03003fe3) AM_DEVREADWRITE("eeprom", ps4_eeprom_r,ps4_eeprom_w)
358
AM_RANGE(0x03000000, 0x030037ff) AM_RAM AM_SHARE("spriteram")
359
AM_RANGE(0x03003fe0, 0x03003fe3) AM_DEVREADWRITE_LEGACY("eeprom", ps4_eeprom_r,ps4_eeprom_w)
368
360
AM_RANGE(0x03003fe4, 0x03003fe7) AM_READNOP // also writes to this address - might be vblank?
369
361
// AM_RANGE(0x03003fe4, 0x03003fe7) AM_WRITENOP // might be vblank?
370
AM_RANGE(0x03003fe4, 0x03003fef) AM_RAM_WRITE(ps4_vidregs_w) AM_BASE_MEMBER(psikyo4_state, m_vidregs) // vid regs?
362
AM_RANGE(0x03003fe4, 0x03003fef) AM_RAM_WRITE(ps4_vidregs_w) AM_SHARE("vidregs") // vid regs?
371
363
AM_RANGE(0x03003ff0, 0x03003ff3) AM_WRITE(ps4_screen1_brt_w) // screen 1 brightness
372
AM_RANGE(0x03003ff4, 0x03003ff7) AM_WRITE(ps4_bgpen_1_dword_w) AM_BASE_MEMBER(psikyo4_state, m_bgpen_1) // screen 1 clear colour
364
AM_RANGE(0x03003ff4, 0x03003ff7) AM_WRITE(ps4_bgpen_1_dword_w) AM_SHARE("bgpen_1") // screen 1 clear colour
373
365
AM_RANGE(0x03003ff8, 0x03003ffb) AM_WRITE(ps4_screen2_brt_w) // screen 2 brightness
374
AM_RANGE(0x03003ffc, 0x03003fff) AM_WRITE(ps4_bgpen_2_dword_w) AM_BASE_MEMBER(psikyo4_state, m_bgpen_2) // screen 2 clear colour
375
AM_RANGE(0x03004000, 0x03005fff) AM_RAM_WRITE(ps4_paletteram32_RRRRRRRRGGGGGGGGBBBBBBBBxxxxxxxx_dword_w) AM_BASE_MEMBER(psikyo4_state, m_paletteram) // palette
366
AM_RANGE(0x03003ffc, 0x03003fff) AM_WRITE(ps4_bgpen_2_dword_w) AM_SHARE("bgpen_2") // screen 2 clear colour
367
AM_RANGE(0x03004000, 0x03005fff) AM_RAM_WRITE(ps4_paletteram32_RRRRRRRRGGGGGGGGBBBBBBBBxxxxxxxx_dword_w) AM_SHARE("paletteram") // palette
376
368
AM_RANGE(0x03006000, 0x03007fff) AM_ROMBANK("bank2") // data for rom tests (gfx), data is controlled by vidreg
377
AM_RANGE(0x05000000, 0x05000007) AM_DEVREADWRITE8("ymf", ymf278b_r, ymf278b_w, 0xffffffff)
369
AM_RANGE(0x05000000, 0x05000007) AM_DEVREADWRITE8_LEGACY("ymf", ymf278b_r, ymf278b_w, 0xffffffff)
378
370
AM_RANGE(0x05800000, 0x05800003) AM_READ_PORT("P1_P2")
379
371
AM_RANGE(0x05800004, 0x05800007) AM_READ_PORT("P3_P4")
380
AM_RANGE(0x05800008, 0x0580000b) AM_WRITEONLY AM_BASE_MEMBER(psikyo4_state, m_io_select) // Used by Mahjong games to choose input (also maps normal loderndf inputs to offsets)
372
AM_RANGE(0x05800008, 0x0580000b) AM_WRITEONLY AM_SHARE("io_select") // Used by Mahjong games to choose input (also maps normal loderndf inputs to offsets)
382
AM_RANGE(0x06000000, 0x060fffff) AM_RAM AM_BASE_MEMBER(psikyo4_state, m_ram) // main RAM (1 meg)
374
AM_RANGE(0x06000000, 0x060fffff) AM_RAM AM_SHARE("ram") // main RAM (1 meg)
387
379
static INPUT_PORTS_START( hotgmck )
388
380
PORT_START("P1_P2")
389
PORT_BIT( 0x000000ff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CUSTOM(system_port_r, NULL)
381
PORT_BIT( 0x000000ff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CUSTOM_MEMBER(DEVICE_SELF, psikyo4_state,system_port_r, NULL)
390
382
PORT_BIT( 0x00ffff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
391
PORT_BIT( 0xff000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CUSTOM(mahjong_ctrl_r, (void *)0)
383
PORT_BIT( 0xff000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CUSTOM_MEMBER(DEVICE_SELF, psikyo4_state,mahjong_ctrl_r, (void *)0)
393
385
PORT_START("P3_P4")
394
PORT_BIT( 0x000000ff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CUSTOM(system_port_r, NULL)
386
PORT_BIT( 0x000000ff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CUSTOM_MEMBER(DEVICE_SELF, psikyo4_state,system_port_r, NULL)
395
387
PORT_BIT( 0x00ffff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
396
PORT_BIT( 0xff000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CUSTOM(mahjong_ctrl_r, (void *)1)
388
PORT_BIT( 0xff000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CUSTOM_MEMBER(DEVICE_SELF, psikyo4_state,mahjong_ctrl_r, (void *)1)
398
390
PORT_START("JP4")/* jumper pads 'JP4' on the PCB */
399
391
/* EEPROM is read here */