mirror of
https://github.com/holub/mame
synced 2025-05-21 05:08:54 +03:00
From: David Haywood [mailto:neohaze@nildram.co.uk]
Sent: Thursday, October 01, 2009 5:25 AM To: Aaron Giles Subject: MD update I'm trying to get the HazeMD code running again (by request, and so that I can look at fixing some of the bugs that have surfaced, including ones which affect MAME) This shuffles a bunch of stuff around in order to help with that process, I've also killed off some old megaplay code which wasn't really needed anymore, and used the newer code instead.
This commit is contained in:
parent
2fdb170abc
commit
b3adef6de8
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -1620,6 +1620,8 @@ src/mame/drivers/gyruss.c svneol=native#text/plain
|
||||
src/mame/drivers/halleys.c svneol=native#text/plain
|
||||
src/mame/drivers/hanaawas.c svneol=native#text/plain
|
||||
src/mame/drivers/harddriv.c svneol=native#text/plain
|
||||
src/mame/drivers/hazemd_s.c svneol=native#text/plain
|
||||
src/mame/drivers/hazemd_s.h svneol=native#text/plain
|
||||
src/mame/drivers/hcastle.c svneol=native#text/plain
|
||||
src/mame/drivers/hexa.c svneol=native#text/plain
|
||||
src/mame/drivers/hexion.c svneol=native#text/plain
|
||||
|
1756
src/mame/drivers/hazemd_s.c
Normal file
1756
src/mame/drivers/hazemd_s.c
Normal file
File diff suppressed because it is too large
Load Diff
64
src/mame/drivers/hazemd_s.h
Normal file
64
src/mame/drivers/hazemd_s.h
Normal file
@ -0,0 +1,64 @@
|
||||
/* System E stuff */
|
||||
|
||||
enum sms_mapper
|
||||
{
|
||||
MAPPER_STANDARD = 0,
|
||||
MAPPER_CODEMASTERS = 1
|
||||
};
|
||||
|
||||
|
||||
extern VIDEO_UPDATE(megatech_bios);
|
||||
extern VIDEO_UPDATE(megaplay_bios);
|
||||
extern VIDEO_UPDATE(megatech_md_sms);
|
||||
extern DRIVER_INIT( megatech_bios );
|
||||
extern DRIVER_INIT( hazemd_segasyse );
|
||||
extern MACHINE_RESET(megatech_bios);
|
||||
extern MACHINE_RESET(megatech_md_sms);
|
||||
extern VIDEO_EOF(megatech_bios);
|
||||
extern VIDEO_EOF(megatech_md_sms);
|
||||
|
||||
extern READ8_HANDLER( sms_vcounter_r );
|
||||
extern READ8_HANDLER( sms_vdp_data_r );
|
||||
extern WRITE8_HANDLER( sms_vdp_data_w );
|
||||
extern READ8_HANDLER( sms_vdp_ctrl_r );
|
||||
extern WRITE8_HANDLER( sms_vdp_ctrl_w );
|
||||
|
||||
extern void init_for_megadrive(running_machine *machine);
|
||||
extern void segae_md_sms_stop_scanline_timer(void);
|
||||
|
||||
|
||||
extern READ8_HANDLER( md_sms_vdp_vcounter_r );
|
||||
extern READ8_HANDLER( md_sms_vdp_data_r );
|
||||
extern WRITE8_HANDLER( md_sms_vdp_data_w );
|
||||
extern READ8_HANDLER( md_sms_vdp_ctrl_r );
|
||||
extern WRITE8_HANDLER( md_sms_vdp_ctrl_w );
|
||||
|
||||
extern VIDEO_START(sms);
|
||||
extern READ8_HANDLER( sms_vdp_2_data_r );
|
||||
extern WRITE8_HANDLER( sms_vdp_2_data_w );
|
||||
extern READ8_HANDLER( sms_vdp_2_ctrl_r );
|
||||
extern WRITE8_HANDLER( sms_vdp_2_ctrl_w );
|
||||
extern VIDEO_EOF(systeme);
|
||||
extern VIDEO_UPDATE(systeme);
|
||||
extern MACHINE_RESET(systeme);
|
||||
extern UINT8* sms_mainram;
|
||||
extern UINT8* vdp2_vram_bank0;
|
||||
extern UINT8* vdp2_vram_bank1;
|
||||
extern UINT8* vdp1_vram_bank0;
|
||||
extern UINT8* vdp1_vram_bank1;
|
||||
extern void segae_set_vram_banks(UINT8 data);
|
||||
extern void megatech_set_genz80_as_sms_standard_map(running_machine *machine, const char* tag, int mapper);
|
||||
MACHINE_DRIVER_EXTERN(sms);
|
||||
extern DRIVER_INIT(sms);
|
||||
extern DRIVER_INIT(smspal);
|
||||
extern DRIVER_INIT(smscm);
|
||||
extern DRIVER_INIT( smsgg );
|
||||
|
||||
INPUT_PORTS_EXTERN(sms);
|
||||
INPUT_PORTS_EXTERN(gamegear);
|
||||
extern UINT8* smsgg_backupram;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1775,23 +1775,6 @@ UINT8 megatech_bios_port_cc_dc_r(running_machine *machine, int offset, int ctrl)
|
||||
return retdata;
|
||||
}
|
||||
|
||||
/* the SMS inputs should be more complex, like the megadrive ones */
|
||||
READ8_HANDLER (megatech_sms_ioport_dc_r)
|
||||
{
|
||||
running_machine *machine = space->machine;
|
||||
/* 2009-05 FP: would it be worth to give separate inputs to SMS? SMS has only 2 keys A,B (which are B,C on megadrive) */
|
||||
/* bit 4: TL-A; bit 5: TR-A */
|
||||
return (input_port_read(machine, "PAD1") & 0x3f) | ((input_port_read(machine, "PAD2") & 0x03) << 6);
|
||||
}
|
||||
|
||||
READ8_HANDLER (megatech_sms_ioport_dd_r)
|
||||
{
|
||||
running_machine *machine = space->machine;
|
||||
/* 2009-05 FP: would it be worth to give separate inputs to SMS? SMS has only 2 keys A,B (which are B,C on megadrive) */
|
||||
/* bit 2: TL-B; bit 3: TR-B; bit 4: RESET; bit 5: unused; bit 6: TH-A; bit 7: TH-B*/
|
||||
return ((input_port_read(machine, "PAD2") & 0x3c) >> 2) | 0x10;
|
||||
}
|
||||
|
||||
static UINT8 megadrive_io_read_ctrl_port(int portnum)
|
||||
{
|
||||
UINT8 retdata;
|
||||
@ -6387,33 +6370,33 @@ static WRITE8_HANDLER( z80_unmapped_w )
|
||||
|
||||
|
||||
/* sets the megadrive z80 to it's normal ports / map */
|
||||
void megatech_set_megadrive_z80_as_megadrive_z80(running_machine *machine)
|
||||
void megatech_set_megadrive_z80_as_megadrive_z80(running_machine *machine, const char* tag)
|
||||
{
|
||||
const device_config *ym = devtag_get_device(machine, "ym");
|
||||
|
||||
/* INIT THE PORTS *********************************************************************************************/
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_IO), 0x0000, 0xffff, 0, 0, z80_unmapped_port_r, z80_unmapped_port_w);
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, tag, ADDRESS_SPACE_IO), 0x0000, 0xffff, 0, 0, z80_unmapped_port_r, z80_unmapped_port_w);
|
||||
|
||||
/* catch any addresses that don't get mapped */
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x0000, 0xffff, 0, 0, z80_unmapped_r, z80_unmapped_w);
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x0000, 0xffff, 0, 0, z80_unmapped_r, z80_unmapped_w);
|
||||
|
||||
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x0000, 0x1fff, 0, 0, (read8_space_func)SMH_BANK(1), (write8_space_func)SMH_BANK(1));
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x0000, 0x1fff, 0, 0, (read8_space_func)SMH_BANK(1), (write8_space_func)SMH_BANK(1));
|
||||
memory_set_bankptr(machine, 1, genz80.z80_prgram );
|
||||
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x0000, 0x1fff, 0, 0, (read8_space_func)SMH_BANK(6), (write8_space_func)SMH_BANK(6));
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x0000, 0x1fff, 0, 0, (read8_space_func)SMH_BANK(6), (write8_space_func)SMH_BANK(6));
|
||||
memory_set_bankptr(machine, 6, genz80.z80_prgram );
|
||||
|
||||
|
||||
// not allowed??
|
||||
// memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x2000, 0x3fff, 0, 0, (read8_space_func)SMH_BANK(1), (write8_space_func)SMH_BANK(1));
|
||||
// memory_install_readwrite8_handler(cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x2000, 0x3fff, 0, 0, (read8_space_func)SMH_BANK(1), (write8_space_func)SMH_BANK(1));
|
||||
|
||||
memory_install_readwrite8_device_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), ym, 0x4000, 0x4003, 0, 0, ym2612_r, ym2612_w);
|
||||
memory_install_write8_handler (cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x6000, 0x6000, 0, 0, megadriv_z80_z80_bank_w);
|
||||
memory_install_write8_handler (cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x6001, 0x6001, 0, 0, megadriv_z80_z80_bank_w);
|
||||
memory_install_read8_handler (cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x6100, 0x7eff, 0, 0, megadriv_z80_unmapped_read);
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x7f00, 0x7fff, 0, 0, megadriv_z80_vdp_read, megadriv_z80_vdp_write);
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x8000, 0xffff, 0, 0, z80_read_68k_banked_data, z80_write_68k_banked_data);
|
||||
memory_install_readwrite8_device_handler(cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), ym, 0x4000, 0x4003, 0, 0, ym2612_r, ym2612_w);
|
||||
memory_install_write8_handler (cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x6000, 0x6000, 0, 0, megadriv_z80_z80_bank_w);
|
||||
memory_install_write8_handler (cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x6001, 0x6001, 0, 0, megadriv_z80_z80_bank_w);
|
||||
memory_install_read8_handler (cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x6100, 0x7eff, 0, 0, megadriv_z80_unmapped_read);
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x7f00, 0x7fff, 0, 0, megadriv_z80_vdp_read, megadriv_z80_vdp_write);
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, tag, ADDRESS_SPACE_PROGRAM), 0x8000, 0xffff, 0, 0, z80_read_68k_banked_data, z80_write_68k_banked_data);
|
||||
}
|
||||
|
||||
// these are tests for 'special case' hardware to make sure I don't break anything while rearranging things
|
||||
|
@ -25,7 +25,7 @@ extern UINT16* megadrive_ram;
|
||||
extern UINT8 megatech_bios_port_cc_dc_r(running_machine *machine, int offset, int ctrl);
|
||||
extern void megadriv_stop_scanline_timer(void);
|
||||
|
||||
void megatech_set_megadrive_z80_as_megadrive_z80(running_machine *machine);
|
||||
void megatech_set_megadrive_z80_as_megadrive_z80(running_machine *machine, const char* tag);
|
||||
|
||||
extern READ8_HANDLER (megatech_sms_ioport_dc_r);
|
||||
extern READ8_HANDLER (megatech_sms_ioport_dd_r);
|
||||
|
@ -2,6 +2,10 @@
|
||||
|
||||
changelog:
|
||||
|
||||
01 Oct 2009 - Converted to use the HazeMD SMS code so that old code
|
||||
can be removed, however this makes the text transparent,
|
||||
which IIRC is incorrect
|
||||
|
||||
22 Sept 2007 - Started updating this to use the new Megadrive code,
|
||||
fixing issues with Mazin Wars + Grand Slam.
|
||||
However I'm still not convinced that the handling of
|
||||
@ -37,6 +41,12 @@ this reason.
|
||||
|
||||
Only a handful of games were released for this system.
|
||||
|
||||
Bugs:
|
||||
Most of this is guesswork and should be verified on real hw. Sometims after inserting
|
||||
a coin and pressing start the 'press start' message remains on screen and no credit is
|
||||
deducted. (timing?)
|
||||
|
||||
|
||||
*/
|
||||
|
||||
#include "driver.h"
|
||||
@ -46,6 +56,7 @@ Only a handful of games were released for this system.
|
||||
#include "deprecat.h"
|
||||
#include "genesis.h"
|
||||
#include "megadriv.h"
|
||||
#include "hazemd_s.h"
|
||||
|
||||
#define MASTER_CLOCK 53693100
|
||||
|
||||
@ -56,7 +67,9 @@ Only a handful of games were released for this system.
|
||||
static UINT32 bios_bank; // ROM bank selection
|
||||
static UINT16 game_banksel; // Game bank selection
|
||||
static UINT32 bios_mode = MP_ROM; // determines whether ROM banks or Game data
|
||||
// is to read from 0x8000-0xffff
|
||||
// is to read from 0x8000-0xffff
|
||||
static UINT32 mp_bios_bank_addr;
|
||||
|
||||
static UINT32 bios_width; // determines the way the game info ROM is read
|
||||
UINT8 bios_ctrl[6];
|
||||
static UINT8 bios_6600;
|
||||
@ -71,12 +84,13 @@ UINT16 *ic36_ram;
|
||||
//static UINT8 ic36_ram[0x4000];
|
||||
|
||||
|
||||
static UINT8 hintcount; /* line interrupt counter, decreased each scanline */
|
||||
//static UINT8 hintcount; /* line interrupt counter, decreased each scanline */
|
||||
extern UINT8 segae_vintpending;
|
||||
extern UINT8 segae_hintpending;
|
||||
extern UINT8 *segae_vdp_regs[]; /* pointer to vdp's registers */
|
||||
|
||||
// Interrupt handler - from drivers/segasyse.c
|
||||
#if 0
|
||||
static INTERRUPT_GEN (megaplay_bios_irq)
|
||||
{
|
||||
int sline;
|
||||
@ -116,7 +130,7 @@ static INTERRUPT_GEN (megaplay_bios_irq)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static UINT32 readpos = 1; // serial bank selection position (9-bit)
|
||||
|
||||
@ -564,51 +578,73 @@ static WRITE16_HANDLER ( OLD_megaplay_genesis_io_w )
|
||||
|
||||
static READ8_HANDLER( bank_r )
|
||||
{
|
||||
UINT8* bank = memory_region(space->machine, "mpbios");
|
||||
UINT8* game = memory_region(space->machine, "maincpu");
|
||||
UINT32 fulladdress;
|
||||
UINT8* bank = memory_region(space->machine, "mtbios");
|
||||
|
||||
if(game_banksel == 0x142) // Genesis I/O
|
||||
return OLD_megaplay_genesis_io_r(space, (offset & 0x1f) / 2, 0xffff);
|
||||
fulladdress = mp_bios_bank_addr + offset;
|
||||
|
||||
if(bios_mode & MP_ROM)
|
||||
|
||||
if ((fulladdress >= 0x000000) && (fulladdress <= 0x3fffff)) // ROM Addresses
|
||||
{
|
||||
int sel = (bios_bank >> 6) & 0x03;
|
||||
if(bios_mode & MP_ROM)
|
||||
{
|
||||
int sel = (bios_bank >> 6) & 0x03;
|
||||
|
||||
// popmessage("Reading from Bank %i",sel);
|
||||
|
||||
if(sel == 0)
|
||||
return 0xff;
|
||||
if(sel == 0)
|
||||
return 0xff;
|
||||
else
|
||||
return bank[0x10000 + (sel-1)*0x8000 + offset];
|
||||
}
|
||||
else if(bios_width & 0x08)
|
||||
{
|
||||
if(offset >= 0x2000)
|
||||
return ic36_ram[offset - 0x2000];
|
||||
else
|
||||
return ic37_ram[(0x2000 * (bios_bank & 0x03)) + offset];
|
||||
}
|
||||
else
|
||||
return bank[0x10000 + (sel-1)*0x8000 + offset];
|
||||
{
|
||||
return memory_region(space->machine, "maincpu")[fulladdress^1];
|
||||
}
|
||||
}
|
||||
else if(fulladdress>=0xa10000 && fulladdress<=0xa1001f) // IO Acess
|
||||
{
|
||||
return OLD_megaplay_genesis_io_r(space, (offset & 0x1f) / 2, 0xffff);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(game_banksel == 0x60 || game_banksel == 0x61) /* read game info ROM */
|
||||
if(bios_width & 0x08)
|
||||
{
|
||||
if(offset >= 0x2000)
|
||||
return ic36_ram[offset - 0x2000];
|
||||
else
|
||||
return ic37_ram[(0x2000 * (bios_bank & 0x03)) + offset];
|
||||
}
|
||||
else
|
||||
return game[((game_banksel)*0x8000 + offset)];
|
||||
else
|
||||
return game[(game_banksel*0x8000 + (offset ^ 0x01))];
|
||||
printf("bank_r fulladdress %08x\n",fulladdress);
|
||||
return 0x00;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER ( bank_w )
|
||||
{
|
||||
if(game_banksel == 0x142) // Genesis I/O
|
||||
UINT32 fulladdress;
|
||||
fulladdress = mp_bios_bank_addr + offset;
|
||||
|
||||
if ((fulladdress >= 0x000000) && (fulladdress <= 0x3fffff)) // ROM / Megaplay Custom Addresses
|
||||
{
|
||||
if(offset <= 0x1fff && (bios_width & 0x08))
|
||||
{
|
||||
ic37_ram[(0x2000 * (bios_bank & 0x03)) + offset] = data;
|
||||
}
|
||||
|
||||
if(offset >= 0x2000 && (bios_width & 0x08))
|
||||
{
|
||||
// ic36_ram[offset] = data;
|
||||
ic36_ram[offset - 0x2000] = data;
|
||||
}
|
||||
}
|
||||
else if(fulladdress>=0xa10000 && fulladdress<=0xa1001f) // IO Access
|
||||
{
|
||||
OLD_megaplay_genesis_io_w(space, (offset & 0x1f) / 2, data, 0xffff);
|
||||
|
||||
if(offset <= 0x1fff && (bios_width & 0x08))
|
||||
ic37_ram[(0x2000 * (bios_bank & 0x03)) + offset] = data;
|
||||
|
||||
if(offset >= 0x2000 && (bios_width & 0x08))
|
||||
// ic36_ram[offset] = data;
|
||||
ic36_ram[offset - 0x2000] = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("bank_w fulladdress %08x\n",fulladdress);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -686,6 +722,10 @@ static WRITE8_HANDLER( megaplay_game_w )
|
||||
// popmessage("Game bank selected: 0x%03x",game_banksel);
|
||||
logerror("BIOS [0x%04x]: 68K address space bank selected: 0x%03x\n",cpu_get_previouspc(space->cpu),game_banksel);
|
||||
}
|
||||
|
||||
mp_bios_bank_addr = ( ( mp_bios_bank_addr >> 1 ) | ( data << 23 ) ) & 0xff8000;
|
||||
|
||||
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( megaplay_bios_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
@ -714,6 +754,7 @@ UINT8 segae_vdp_data_r ( UINT8 chip );
|
||||
void segae_vdp_ctrl_w ( UINT8 chip, UINT8 data );
|
||||
void segae_vdp_data_w ( running_machine *machine, UINT8 chip, UINT8 data );
|
||||
|
||||
#if 0
|
||||
static READ8_HANDLER (megaplay_bios_port_be_bf_r)
|
||||
{
|
||||
UINT8 temp = 0;
|
||||
@ -738,38 +779,48 @@ static WRITE8_HANDLER (megaplay_bios_port_be_bf_w)
|
||||
segae_vdp_ctrl_w(0, data); break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static ADDRESS_MAP_START( megaplay_bios_io_map, ADDRESS_SPACE_IO, 8 )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
// AM_RANGE(0x3f, 0x3f) AM_WRITE(megatech_bios_port_ctrl_w)
|
||||
AM_RANGE(0x7f, 0x7f) AM_DEVWRITE("sn2", sn76496_w) /* SN76489 */
|
||||
// AM_RANGE(0xdc, 0xdc) AM_READ(megatech_bios_port_dc_r) // player inputs
|
||||
// AM_RANGE(0xdd, 0xdd) AM_READ(megatech_bios_port_dd_r) // other player 2 inputs
|
||||
AM_RANGE(0xbe, 0xbf) AM_READWRITE(megaplay_bios_port_be_bf_r, megaplay_bios_port_be_bf_w) /* VDP */
|
||||
AM_RANGE(0xbe, 0xbe) AM_READWRITE(sms_vdp_data_r, sms_vdp_data_w) /* VDP */
|
||||
AM_RANGE(0xbf, 0xbf) AM_READWRITE(sms_vdp_ctrl_r, sms_vdp_ctrl_w) /* VDP */
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/* in video/segasyse.c */
|
||||
VIDEO_START( megaplay_normal );
|
||||
VIDEO_UPDATE( megaplay_normal );
|
||||
|
||||
|
||||
|
||||
static VIDEO_START(megplay)
|
||||
{
|
||||
//printf("megplay vs\n");
|
||||
VIDEO_START_CALL(megadriv);
|
||||
VIDEO_START_CALL(megaplay_normal);
|
||||
// VIDEO_START_CALL(megaplay_normal);
|
||||
}
|
||||
|
||||
static VIDEO_UPDATE(megplay)
|
||||
{
|
||||
//printf("megplay vu\n");
|
||||
VIDEO_UPDATE_CALL(megadriv);
|
||||
VIDEO_UPDATE_CALL(megaplay_normal);
|
||||
// VIDEO_UPDATE_CALL(megaplay_normal);
|
||||
VIDEO_UPDATE_CALL(megaplay_bios);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//extern VIDEO_EOF(megadriv);
|
||||
static MACHINE_RESET( mpnew )
|
||||
{
|
||||
mp_bios_bank_addr = 0;
|
||||
MACHINE_RESET_CALL(megadriv);
|
||||
MACHINE_RESET_CALL(megatech_bios);
|
||||
}
|
||||
|
||||
static VIDEO_EOF( mpnew )
|
||||
{
|
||||
VIDEO_EOF_CALL(megadriv);
|
||||
VIDEO_EOF_CALL(megatech_bios);
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( mpnew )
|
||||
|
||||
@ -778,10 +829,13 @@ static MACHINE_DRIVER_START( mpnew )
|
||||
|
||||
/* The Megaplay has an extra BIOS cpu which drives an SMS VDP
|
||||
which includes an SN76496 for sound */
|
||||
MDRV_CPU_ADD("mpbios", Z80, MASTER_CLOCK / 15) /* ?? */
|
||||
MDRV_CPU_ADD("mtbios", Z80, MASTER_CLOCK / 15) /* ?? */
|
||||
MDRV_CPU_PROGRAM_MAP(megaplay_bios_map)
|
||||
MDRV_CPU_IO_MAP(megaplay_bios_io_map)
|
||||
MDRV_CPU_VBLANK_INT_HACK(megaplay_bios_irq, 262)
|
||||
//MDRV_CPU_VBLANK_INT_HACK(megaplay_bios_irq, 262)
|
||||
|
||||
MDRV_MACHINE_RESET( mpnew )
|
||||
MDRV_VIDEO_EOF( mpnew )
|
||||
|
||||
MDRV_QUANTUM_TIME(HZ(6000))
|
||||
|
||||
@ -811,10 +865,16 @@ ROM_START( megaplay )
|
||||
|
||||
ROM_REGION( 0x8000, "user1", ROMREGION_ERASEFF )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
/* The system appears to access the instruction rom at
|
||||
0x300000 in the 68k space (rom window from z80 side)
|
||||
|
||||
This probably means the maximum 68k rom size is 0x2fffff for MegaPlay
|
||||
*/
|
||||
|
||||
ROM_START( mp_sonic ) /* Sonic */
|
||||
ROM_REGION( 0x400000, "maincpu", 0 )
|
||||
ROM_LOAD16_BYTE( "ep15177.ic2", 0x000000, 0x040000, CRC(a389b03b) SHA1(8e9e1cf3dd65ddf08757f5a1ce472130c902ea2c) )
|
||||
@ -824,7 +884,7 @@ ROM_START( mp_sonic ) /* Sonic */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "ep15175-01.ic3", 0x000000, 0x08000, CRC(99246889) SHA1(184aa3b7fdedcf578c5e34edb7ed44f57f832258) )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -840,7 +900,7 @@ ROM_START( mp_col3 ) /* Columns 3 */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "1.ic3", 0x000000, 0x08000, CRC(dac9bf91) SHA1(0117972a7181f8aaf942a259cc8764b821031253) )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -853,7 +913,7 @@ ROM_START( mp_gaxe2 ) /* Golden Axe 2 */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "ep15175-02b.ic3", 0x000000, 0x08000, CRC(3039b653) SHA1(b19874c74d0fc0cca1169f62e5e74f0e8ca83679) ) // 15175-02b.ic3
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -866,7 +926,7 @@ ROM_START( mp_gslam ) /* Grand Slam */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "epr-15175-03.ic3", 0x000000, 0x08000, CRC(70ea1aec) SHA1(0d9d82a1f8aa51d02707f7b343e7cfb6591efccd) ) // 15175-02b.ic3
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -880,7 +940,7 @@ ROM_START( mp_twc ) /* Tecmo World Cup */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "ep15175-04.ic3", 0x000000, 0x08000, CRC(faf7c030) SHA1(16ef405335b4d3ecb0b7d97b088dafc4278d4726) )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -892,7 +952,7 @@ ROM_START( mp_sor2 ) /* Streets of Rage 2 */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "epr-15175-05.ic2", 0x000000, 0x08000, CRC(1df5347c) SHA1(faced2e875e1914392f61577b5256d006eebeef9) )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -904,7 +964,7 @@ ROM_START( mp_bio ) /* Bio Hazard Battle */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "epr-15175-06.ic2", 0x000000, 0x08000, CRC(1ef64e41) SHA1(13984b714b014ea41963b70de74a5358ed223bc5) )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -916,7 +976,7 @@ ROM_START( mp_soni2 ) /* Sonic The Hedgehog 2 */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "epr-15175-07.ic1", 0x000000, 0x08000, CRC(bb5f67f0) SHA1(33b7a5d14015a5fcf41976a8f648f8f48ce9bb03) )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -928,7 +988,7 @@ ROM_START( mp_mazin ) /* Mazin Wars */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "epr-15175-11.ic2", 0x000000, 0x08000, CRC(bb651120) SHA1(81cb736f2732373e260dde162249c1d29a3489c3) )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
@ -940,14 +1000,14 @@ ROM_START( mp_shnb3 ) /* Shinobi 3 */
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
|
||||
ROM_LOAD( "epr-15175-09.ic2", 0x000000, 0x08000, CRC(6254e45a) SHA1(8667922a6eade03c964ce224f7fa39ba871c60a4) )
|
||||
|
||||
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */
|
||||
ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
|
||||
MEGAPLAY_BIOS
|
||||
ROM_END
|
||||
|
||||
|
||||
static void megplay_stat(running_machine *machine)
|
||||
{
|
||||
UINT8 *src = memory_region(machine, "mpbios");
|
||||
UINT8 *src = memory_region(machine, "mtbios");
|
||||
UINT8 *instruction_rom = memory_region(machine, "user1");
|
||||
UINT8 *game_rom = memory_region(machine, "maincpu");
|
||||
int offs;
|
||||
@ -1010,6 +1070,9 @@ static DRIVER_INIT (megaplay)
|
||||
|
||||
/* instead of a RAM mirror the 68k sees the extra ram of the 2nd z80 too */
|
||||
memory_install_readwrite16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xa02000, 0xa03fff, 0, 0, megadriv_68k_read_z80_extra_ram, megadriv_68k_write_z80_extra_ram);
|
||||
|
||||
DRIVER_INIT_CALL(megatech_bios); // create the SMS vdp etc.
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -91,7 +91,7 @@ Sonic Hedgehog 2 171-6215A 837-6963-62 610-0239-62 MPR
|
||||
#include "sound/sn76496.h"
|
||||
#include "rendlay.h"
|
||||
|
||||
#include "segae.h"
|
||||
#include "hazemd_s.h"
|
||||
#include "genesis.h"
|
||||
#include "megadriv.h"
|
||||
|
||||
@ -248,59 +248,6 @@ static READ8_HANDLER( megatech_cart_select_r )
|
||||
return (mt_cart_select_reg);
|
||||
}
|
||||
|
||||
static READ8_HANDLER( z80_unmapped_port_r )
|
||||
{
|
||||
printf("unmapped z80 port read %04x\n",offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( z80_unmapped_port_w )
|
||||
{
|
||||
printf("unmapped z80 port write %04x\n",offset);
|
||||
}
|
||||
|
||||
static READ8_HANDLER( z80_unmapped_r )
|
||||
{
|
||||
printf("unmapped z80 read %04x\n",offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( z80_unmapped_w )
|
||||
{
|
||||
printf("unmapped z80 write %04x\n",offset);
|
||||
}
|
||||
|
||||
static UINT8* sms_mainram;
|
||||
static UINT8* sms_rom;
|
||||
|
||||
|
||||
static WRITE8_HANDLER( mt_sms_standard_rom_bank_w )
|
||||
{
|
||||
int bank = data&0x1f;
|
||||
//logerror("bank w %02x %02x\n", offset, data);
|
||||
|
||||
sms_mainram[0x1ffc+offset] = data;
|
||||
switch (offset)
|
||||
{
|
||||
case 0:
|
||||
logerror("bank w %02x %02x\n", offset, data);
|
||||
memory_install_readwrite8_handler(space, 0x0000, 0xbfff, 0, 0, (read8_space_func)SMH_BANK(5), (write8_space_func)SMH_UNMAP);
|
||||
|
||||
//printf("bank ram??\n");
|
||||
break;
|
||||
case 1:
|
||||
memcpy(sms_rom+0x0000, memory_region(space->machine, "maincpu")+bank*0x4000, 0x4000);
|
||||
break;
|
||||
case 2:
|
||||
memcpy(sms_rom+0x4000, memory_region(space->machine, "maincpu")+bank*0x4000, 0x4000);
|
||||
break;
|
||||
case 3:
|
||||
memcpy(sms_rom+0x8000, memory_region(space->machine, "maincpu")+bank*0x4000, 0x4000);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef UNUSED_FUNCTION
|
||||
READ8_HANDLER( md_sms_ioport_dc_r )
|
||||
{
|
||||
@ -315,56 +262,6 @@ READ8_HANDLER( md_sms_ioport_dd_r )
|
||||
|
||||
|
||||
|
||||
static void megatech_set_genz80_as_sms_standard_ports(running_machine *machine)
|
||||
{
|
||||
/* INIT THE PORTS *********************************************************************************************/
|
||||
|
||||
const address_space *io = cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_IO);
|
||||
const device_config *sn = devtag_get_device(machine, "sn");
|
||||
|
||||
memory_install_readwrite8_handler(io, 0x0000, 0xffff, 0, 0, z80_unmapped_port_r, z80_unmapped_port_w);
|
||||
|
||||
memory_install_read8_handler (io, 0x7e, 0x7e, 0, 0, md_sms_vdp_vcounter_r);
|
||||
memory_install_write8_device_handler(io, sn, 0x7e, 0x7f, 0, 0, sn76496_w);
|
||||
memory_install_readwrite8_handler(io, 0xbe, 0xbe, 0, 0, md_sms_vdp_data_r, md_sms_vdp_data_w);
|
||||
memory_install_readwrite8_handler(io, 0xbf, 0xbf, 0, 0, md_sms_vdp_ctrl_r, md_sms_vdp_ctrl_w);
|
||||
|
||||
memory_install_read8_handler (io, 0x10, 0x10, 0, 0, megatech_sms_ioport_dd_r); // super tetris
|
||||
|
||||
memory_install_read8_handler (io, 0xdc, 0xdc, 0, 0, megatech_sms_ioport_dc_r);
|
||||
memory_install_read8_handler (io, 0xdd, 0xdd, 0, 0, megatech_sms_ioport_dd_r);
|
||||
memory_install_read8_handler (io, 0xde, 0xde, 0, 0, megatech_sms_ioport_dd_r);
|
||||
memory_install_read8_handler (io, 0xdf, 0xdf, 0, 0, megatech_sms_ioport_dd_r); // adams family
|
||||
}
|
||||
|
||||
static void megatech_set_genz80_as_sms_standard_map(running_machine *machine)
|
||||
{
|
||||
/* INIT THE MEMMAP / BANKING *********************************************************************************/
|
||||
|
||||
/* catch any addresses that don't get mapped */
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x0000, 0xffff, 0, 0, z80_unmapped_r, z80_unmapped_w);
|
||||
|
||||
/* fixed rom bank area */
|
||||
sms_rom = auto_alloc_array(machine, UINT8, 0x400000);
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x0000, 0xbfff, 0, 0, (read8_space_func)SMH_BANK(5), (write8_space_func)SMH_UNMAP);
|
||||
memory_set_bankptr(machine, 5, sms_rom );
|
||||
|
||||
memcpy(sms_rom, memory_region(machine, "maincpu"), 0x400000);
|
||||
|
||||
/* main ram area */
|
||||
sms_mainram = auto_alloc_array(machine, UINT8, 0x2000); // 8kb of main ram
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0xc000, 0xdfff, 0, 0, (read8_space_func)SMH_BANK(6), (write8_space_func)SMH_BANK(6));
|
||||
memory_set_bankptr(machine, 6, sms_mainram );
|
||||
memory_install_readwrite8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0xe000, 0xffff, 0, 0, (read8_space_func)SMH_BANK(7), (write8_space_func)SMH_BANK(7));
|
||||
memory_set_bankptr(machine, 7, sms_mainram );
|
||||
memset(sms_mainram,0x00,0x2000);
|
||||
|
||||
memory_install_write8_handler(cputag_get_address_space(machine, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0xfffc, 0xffff, 0, 0, mt_sms_standard_rom_bank_w);
|
||||
|
||||
megatech_set_genz80_as_sms_standard_ports(machine);
|
||||
// smsgg_backupram = NULL;
|
||||
|
||||
}
|
||||
|
||||
static void megatech_select_game(running_machine *machine, int gameno)
|
||||
{
|
||||
@ -402,7 +299,7 @@ static void megatech_select_game(running_machine *machine, int gameno)
|
||||
{
|
||||
printf("SMS cart!!, CPU not running\n");
|
||||
current_game_is_sms = 1;
|
||||
megatech_set_genz80_as_sms_standard_map(machine);
|
||||
megatech_set_genz80_as_sms_standard_map(machine, "genesis_snd_z80", MAPPER_STANDARD);
|
||||
cputag_set_input_line(machine, "genesis_snd_z80", INPUT_LINE_HALT, CLEAR_LINE);
|
||||
cputag_set_input_line(machine, "genesis_snd_z80", INPUT_LINE_RESET, CLEAR_LINE);
|
||||
|
||||
@ -412,7 +309,7 @@ static void megatech_select_game(running_machine *machine, int gameno)
|
||||
{
|
||||
printf("Genesis Cart, CPU0 running\n");
|
||||
current_game_is_sms = 0;
|
||||
megatech_set_megadrive_z80_as_megadrive_z80(machine);
|
||||
megatech_set_megadrive_z80_as_megadrive_z80(machine, "genesis_snd_z80");
|
||||
cputag_set_input_line(machine, "maincpu", INPUT_LINE_RESET, CLEAR_LINE);
|
||||
cputag_set_input_line(machine, "maincpu", INPUT_LINE_HALT, CLEAR_LINE);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1128,7 +1128,7 @@ $(MAMEOBJ)/sega.a: \
|
||||
$(DRIVERS)/segas18.o $(VIDEO)/segas18.o \
|
||||
$(DRIVERS)/segas24.o $(MACHINE)/segas24.o $(VIDEO)/segas24.o \
|
||||
$(DRIVERS)/segas32.o $(MACHINE)/segas32.o $(VIDEO)/segas32.o \
|
||||
$(DRIVERS)/segae.o $(VIDEO)/segasyse.o \
|
||||
$(DRIVERS)/hazemd_s.o $(DRIVERS)/segae.o \
|
||||
$(DRIVERS)/segaxbd.o $(VIDEO)/segaxbd.o \
|
||||
$(DRIVERS)/segaybd.o $(VIDEO)/segaybd.o \
|
||||
$(DRIVERS)/ssf2md.o \
|
||||
|
@ -12,9 +12,6 @@
|
||||
|
||||
#include "genesis.h"
|
||||
|
||||
/* in video/segasyse.c */
|
||||
VIDEO_START( megaplay_normal );
|
||||
VIDEO_UPDATE( megaplay_normal );
|
||||
|
||||
static const device_config *genesis_screen;
|
||||
|
||||
@ -279,6 +276,7 @@ VIDEO_UPDATE( segac2 )
|
||||
/* megaplay, draws either Genesis or SMS (single screen display) */
|
||||
|
||||
/* core refresh: computes the final screen */
|
||||
#if 0
|
||||
VIDEO_UPDATE( megaplay )
|
||||
{
|
||||
int y;
|
||||
@ -287,10 +285,11 @@ VIDEO_UPDATE( megaplay )
|
||||
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
|
||||
drawline(BITMAP_ADDR16(bitmap, y, 0), y, 0);
|
||||
|
||||
VIDEO_UPDATE_CALL(megaplay_normal);
|
||||
//VIDEO_UPDATE_CALL(megaplay_normal);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void system18_vdp_update( bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
|
@ -1,573 +1,2 @@
|
||||
/*******************************************************************************
|
||||
Sega System E (834-5803) Driver (video/segasyse.c)
|
||||
********************************************************************************
|
||||
driver by David Haywood
|
||||
|
||||
this is currently only used by megaplay, and will soon be obsolete.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include "driver.h"
|
||||
|
||||
/*-- Variables --*/
|
||||
|
||||
#define CHIPS 2 /* There are 2 VDP Chips */
|
||||
|
||||
static UINT8 vdp_cmdpart[CHIPS]; /* VDP Command Part Counter */
|
||||
static UINT16 vdp_command[CHIPS]; /* VDP Command Word */
|
||||
|
||||
static UINT8 vdp_accessmode[CHIPS]; /* VDP Access Mode (VRAM, CRAM) */
|
||||
static UINT16 vdp_accessaddr[CHIPS]; /* VDP Access Address */
|
||||
static UINT8 vdp_readbuffer[CHIPS]; /* VDP Read Buffer */
|
||||
|
||||
static UINT8 *segae_vdp_vram[CHIPS]; /* Pointer to VRAM */
|
||||
static UINT8 *vdp_cram[CHIPS]; /* Pointer to the VDP's CRAM */
|
||||
UINT8 *segae_vdp_regs[CHIPS]; /* Pointer to the VDP's Registers */
|
||||
|
||||
static UINT8 segae_vdp_vrambank[CHIPS]; /* Current VRAM Bank number (from writes to Port 0xf7) */
|
||||
|
||||
static UINT8 *cache_bitmap; /* 8bpp bitmap with raw pen values */
|
||||
|
||||
static int palette_base; // needed for megatech for now..
|
||||
|
||||
UINT8 segae_vintpending;
|
||||
UINT8 segae_hintpending;
|
||||
|
||||
/*-- Prototypes --*/
|
||||
|
||||
static void vdp_start(running_machine *machine, UINT8 chip );
|
||||
|
||||
static void vdp_processcmd(UINT8 chip, UINT16 cmd);
|
||||
static void vdp_setregister(UINT8 chip, UINT16 cmd);
|
||||
|
||||
static void draw_tiles_line(UINT8 *dest, int line, UINT8 chip, UINT8 pri);
|
||||
static void draw_sprite_line(UINT8 *dest, UINT8 chip, UINT8 line);
|
||||
static void segae_drawscanline(running_machine *machine, int line, int chips, int blank);
|
||||
|
||||
static void draw_8pix_solid16(UINT8 *dest, UINT8 chip, UINT16 tile, UINT8 line, UINT8 flipx, UINT8 col);
|
||||
static void draw_8pix(UINT8 *dest, UINT8 chip, UINT16 tile, UINT8 line, UINT8 flipx, UINT8 col);
|
||||
static void draw_8pix_sprite(UINT8 *dest, UINT8 chip, UINT16 tile, UINT8 line);
|
||||
|
||||
/*******************************************************************************
|
||||
vhstart, vhstop and vhrefresh functions
|
||||
*******************************************************************************/
|
||||
|
||||
/* starts vdp for bios screen only */
|
||||
VIDEO_START( megaplay_normal )
|
||||
{
|
||||
palette_base = 0x40;
|
||||
|
||||
vdp_start(machine, 0);
|
||||
|
||||
cache_bitmap = auto_alloc_array(machine, UINT8, (16+256+16) * 192); /* 16 pixels either side to simplify drawing */
|
||||
}
|
||||
|
||||
VIDEO_UPDATE( megaplay_normal )
|
||||
{
|
||||
int miny = (cliprect->min_y < 16) ? 16 : cliprect->min_y;
|
||||
int maxy = (cliprect->max_y > 16+192-1) ? 16+192-1 : cliprect->max_y;
|
||||
int i;
|
||||
|
||||
/*- Draw from cache_bitmap to screen -*/
|
||||
|
||||
for (i = miny; i <= maxy;i++)
|
||||
segae_drawscanline(screen->machine, i-16,0,0);
|
||||
|
||||
for (i = miny;i <= maxy;i++)
|
||||
{
|
||||
UINT16 *dest = BITMAP_ADDR16(bitmap, i, 32);
|
||||
int x;
|
||||
for (x = 0; x < 256; x++)
|
||||
{
|
||||
UINT8 pix = cache_bitmap[(i-16) * (16+256+16) + 24 + x];
|
||||
if (pix != 0)
|
||||
dest[x] = screen->machine->pens[palette_base + pix];
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
VDP Start / Stop Functions
|
||||
********************************************************************************
|
||||
note: we really should check after each allocation to make sure it was
|
||||
successful then if one allocation fails we can free up the previous ones
|
||||
*******************************************************************************/
|
||||
|
||||
static void vdp_start(running_machine *machine, UINT8 chip)
|
||||
{
|
||||
UINT8 temp;
|
||||
|
||||
/*- VRAM -*/
|
||||
|
||||
segae_vdp_vram[chip] = auto_alloc_array(machine, UINT8, 0x8000); /* 32kb (2 banks) */
|
||||
segae_vdp_vrambank[chip] = 0;
|
||||
|
||||
/*- CRAM -*/
|
||||
|
||||
vdp_cram[chip] = auto_alloc_array(machine, UINT8, 0x20);
|
||||
|
||||
/*- VDP Registers -*/
|
||||
|
||||
segae_vdp_regs[chip] = auto_alloc_array(machine, UINT8, 0x20);
|
||||
|
||||
/*- Clear Memory -*/
|
||||
|
||||
memset(segae_vdp_vram[chip], 0, 0x8000);
|
||||
memset(vdp_cram[chip], 0, 0x20);
|
||||
memset(segae_vdp_regs[chip], 0, 0x20);
|
||||
|
||||
/*- Set Up Some Default Values */
|
||||
|
||||
vdp_accessaddr[chip] = 0;
|
||||
vdp_accessmode[chip] = 0;
|
||||
vdp_cmdpart[chip] = 0;
|
||||
vdp_command[chip] = 0;
|
||||
|
||||
/*- Black the Palette -*/
|
||||
|
||||
for (temp=0;temp<32;temp++)
|
||||
palette_set_color(machine, temp + 32*chip+palette_base, MAKE_RGB(0, 0, 0));
|
||||
|
||||
/* Save State Stuff (based on video/taitoic.c) */
|
||||
|
||||
state_save_register_item_pointer(machine, "VDP", NULL, chip, segae_vdp_vram[chip], 0x8000);
|
||||
state_save_register_item_pointer(machine, "VDP", NULL, chip, vdp_cram[chip], 0x20);
|
||||
state_save_register_item_pointer(machine, "VDP", NULL, chip, segae_vdp_regs[chip], 0x20);
|
||||
state_save_register_item(machine, "VDP", NULL, chip, vdp_cmdpart[chip]);
|
||||
state_save_register_item(machine, "VDP", NULL, chip, vdp_command[chip]);
|
||||
state_save_register_item(machine, "VDP", NULL, chip, vdp_accessmode[chip]);
|
||||
state_save_register_item(machine, "VDP", NULL, chip, vdp_accessaddr[chip]);
|
||||
state_save_register_item(machine, "VDP", NULL, chip, segae_vdp_vrambank[chip]);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
Core VDP Functions
|
||||
*******************************************************************************/
|
||||
|
||||
/*-- Reads --*/
|
||||
|
||||
/***************************************
|
||||
segae_vdp_ctrl_r ( UINT8 chip )
|
||||
****************************************
|
||||
reading the vdp control port will
|
||||
return the following
|
||||
|
||||
bit:
|
||||
7 - vert int pending
|
||||
6 - line int pending
|
||||
5 - sprite collision (non 0 pixels) *not currently emulated (not needed by these games)*
|
||||
4 - always 0
|
||||
3 - always 0
|
||||
2 - always 0
|
||||
1 - always 0
|
||||
0 - always 0
|
||||
|
||||
bits 5,6,7 are cleared after a read
|
||||
***************************************/
|
||||
|
||||
UINT8 segae_vdp_ctrl_r ( UINT8 chip )
|
||||
{
|
||||
UINT8 temp;
|
||||
|
||||
temp = 0;
|
||||
|
||||
temp |= (segae_vintpending << 7);
|
||||
temp |= (segae_hintpending << 6);
|
||||
|
||||
segae_hintpending = segae_vintpending = 0;
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
UINT8 segae_vdp_data_r ( UINT8 chip )
|
||||
{
|
||||
UINT8 temp;
|
||||
|
||||
vdp_cmdpart[chip] = 0;
|
||||
|
||||
temp = vdp_readbuffer[chip];
|
||||
|
||||
if (vdp_accessmode[chip]==0x03) { /* CRAM Access */
|
||||
/* error CRAM can't be read!! */
|
||||
} else { /* VRAM */
|
||||
vdp_readbuffer[chip] = segae_vdp_vram[chip][ segae_vdp_vrambank[chip]*0x4000 + vdp_accessaddr[chip] ];
|
||||
vdp_accessaddr[chip] += 1;
|
||||
vdp_accessaddr[chip] &= 0x3fff;
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
|
||||
/*-- Writes --*/
|
||||
|
||||
void segae_vdp_ctrl_w ( UINT8 chip, UINT8 data )
|
||||
{
|
||||
if (!vdp_cmdpart[chip]) {
|
||||
vdp_cmdpart[chip] = 1;
|
||||
vdp_command[chip] = data;
|
||||
} else {
|
||||
vdp_cmdpart[chip] = 0;
|
||||
vdp_command[chip] |= (data << 8);
|
||||
vdp_processcmd (chip, vdp_command[chip]);
|
||||
}
|
||||
}
|
||||
|
||||
void segae_vdp_data_w ( running_machine *machine, UINT8 chip, UINT8 data )
|
||||
{
|
||||
vdp_cmdpart[chip] = 0;
|
||||
|
||||
if (vdp_accessmode[chip]==0x03) { /* CRAM Access */
|
||||
UINT8 r,g,b, temp;
|
||||
|
||||
temp = vdp_cram[chip][vdp_accessaddr[chip]];
|
||||
|
||||
vdp_cram[chip][vdp_accessaddr[chip]] = data;
|
||||
|
||||
if (temp != data) {
|
||||
r = (vdp_cram[chip][vdp_accessaddr[chip]] & 0x03) >> 0;
|
||||
g = (vdp_cram[chip][vdp_accessaddr[chip]] & 0x0c) >> 2;
|
||||
b = (vdp_cram[chip][vdp_accessaddr[chip]] & 0x30) >> 4;
|
||||
|
||||
palette_set_color_rgb(machine, vdp_accessaddr[chip] + 32*chip+palette_base, pal2bit(r), pal2bit(g), pal2bit(b));
|
||||
}
|
||||
|
||||
vdp_accessaddr[chip] += 1;
|
||||
vdp_accessaddr[chip] &= 0x1f;
|
||||
} else { /* VRAM Accesses */
|
||||
segae_vdp_vram[chip][ segae_vdp_vrambank[chip]*0x4000 + vdp_accessaddr[chip] ] = data;
|
||||
vdp_accessaddr[chip] += 1;
|
||||
vdp_accessaddr[chip] &= 0x3fff;
|
||||
}
|
||||
}
|
||||
|
||||
/*-- Associated Functions --*/
|
||||
|
||||
/***************************************
|
||||
vdp_processcmd
|
||||
****************************************
|
||||
|
||||
general command format
|
||||
|
||||
M M A A A A A A A A A A A A A A M=Mode, A=Address
|
||||
|
||||
the command will be one of 3 things according to the upper
|
||||
4 bits
|
||||
|
||||
0 0 - - - - - - - - - - - - - - VRAM Acess Mode (Special Read)
|
||||
|
||||
0 1 - - - - - - - - - - - - - - VRAM Acesss Mode
|
||||
|
||||
1 0 0 0 - - - - - - - - - - - - VDP Register Set (current mode & address _not_ changed)
|
||||
|
||||
1 0 x x - - - - - - - - - - - - VRAM Access Mode (0x1000 - 0x3FFF only, x x is anything but 0 0)
|
||||
|
||||
1 1 - - - - - - - - - - - - - - CRAM Access Mode
|
||||
|
||||
***************************************/
|
||||
|
||||
static void vdp_processcmd (UINT8 chip, UINT16 cmd)
|
||||
{
|
||||
if ( (cmd & 0xf000) == 0x8000 ) { /* 1 0 0 0 - - - - - - - - - - - - VDP Register Set */
|
||||
vdp_setregister (chip, cmd);
|
||||
} else { /* Anything Else */
|
||||
vdp_accessmode[chip] = (cmd & 0xc000) >> 14;
|
||||
vdp_accessaddr[chip] = (cmd & 0x3fff);
|
||||
|
||||
if ((vdp_accessmode[chip]==0x03) && (vdp_accessaddr[chip] > 0x1f) ) { /* Check Address is valid for CRAM */
|
||||
/* Illegal, CRAM isn't this large! */
|
||||
vdp_accessaddr[chip] &= 0x1f;
|
||||
}
|
||||
|
||||
if (vdp_accessmode[chip] == 0x00) { /* 0 0 - - - - - - - - - - - - - - VRAM Acess Mode (Special Read) */
|
||||
vdp_readbuffer[chip] = segae_vdp_vram[chip][ segae_vdp_vrambank[chip]*0x4000 + vdp_accessaddr[chip] ];
|
||||
vdp_accessaddr[chip] += 1;
|
||||
vdp_accessaddr[chip] &= 0x3fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************
|
||||
vdp_setregister
|
||||
|
||||
general command format
|
||||
|
||||
1 0 0 0 R R R R D D D D D D D D 1/0 = Fixed Values, R = Register # / Address, D = Data
|
||||
|
||||
***************************************/
|
||||
|
||||
static void vdp_setregister(UINT8 chip, UINT16 cmd)
|
||||
{
|
||||
UINT8 regnumber;
|
||||
UINT8 regdata;
|
||||
|
||||
regnumber = (cmd & 0x0f00) >> 8;
|
||||
regdata = (cmd & 0x00ff);
|
||||
|
||||
if (regnumber < 11) {
|
||||
segae_vdp_regs[chip][regnumber] = regdata;
|
||||
} else {
|
||||
/* Illegal, there aren't this many registers! */
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
System E Drawing Capabilities Notes
|
||||
********************************************************************************
|
||||
Display Consists of
|
||||
|
||||
VDP0 Backdrop Color (?)
|
||||
VDP0 Tiles (Low)
|
||||
VDP0 Sprites
|
||||
VDP0 Tiles (High)
|
||||
VDP1 Tiles (Low)
|
||||
VDP1 Sprites
|
||||
VDP1 Tiles (High)
|
||||
|
||||
each vdp has its on vram, etc etc.
|
||||
|
||||
the tilemaps are 256x224 in size, 256x192 of this is visible, the tiles
|
||||
are 8x8 pixels, so 32x28 of 8x8 tiles make a 256x224 tilemap.
|
||||
|
||||
the tiles are 4bpp (16 colours), video ram can hold upto 512 tile gfx
|
||||
|
||||
tile references are 16 bits (3 bits unused, 1 bit priority, 1 bit palette,
|
||||
2 bits for flip, 9 bits for tile number)
|
||||
|
||||
tilemaps can be scrolled horizontally, the top 16 lines of the display can
|
||||
have horinzontal scrolling disabled
|
||||
|
||||
tilemaps can be scrolled vertically, the right 64 lines of the display can
|
||||
have the vertical scrolling disabled
|
||||
|
||||
the leftmost 8 line of the display can be blanked
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
static void segae_drawscanline(running_machine *machine, int line, int chips, int blank)
|
||||
{
|
||||
|
||||
UINT8* dest;
|
||||
|
||||
if (video_skip_this_frame())
|
||||
return;
|
||||
|
||||
dest = cache_bitmap + (16+256+16) * line;
|
||||
|
||||
/* This should be cleared to bg colour, but which vdp determines that !, neither seems to be right, maybe its always the same col? */
|
||||
memset(dest, 0, 16+256+16);
|
||||
|
||||
if (segae_vdp_regs[0][1] & 0x40) {
|
||||
draw_tiles_line (dest+16, line, 0,0);
|
||||
draw_sprite_line(dest+16, 0, line);
|
||||
draw_tiles_line (dest+16, line, 0,1);
|
||||
}
|
||||
|
||||
if (chips>0) /* we don't want to do this on megatech */
|
||||
{
|
||||
if (segae_vdp_regs[1][1] & 0x40) {
|
||||
draw_tiles_line (dest+16, line, 1,0);
|
||||
draw_sprite_line(dest+16, 1, line);
|
||||
draw_tiles_line (dest+16, line, 1,1);
|
||||
}
|
||||
}
|
||||
|
||||
/* FIX ME!! */
|
||||
if (blank)
|
||||
{
|
||||
if (strcmp(machine->gamedrv->name,"tetrisse")) /* and we really don't want to do it on tetrise */
|
||||
memset(dest+16, 32+16, 8); /* Clear Leftmost column, there should be a register for this like on the SMS i imagine */
|
||||
/* on the SMS this is bit 5 of register 0 (according to CMD's SMS docs) for system E this */ /* appears to be incorrect, most games need it blanked 99% of the time so we blank it */
|
||||
}
|
||||
}
|
||||
|
||||
/*-- Drawing a line of tiles --*/
|
||||
|
||||
static void draw_tiles_line(UINT8 *dest, int line, UINT8 chip, UINT8 pri)
|
||||
{
|
||||
/* todo: fix vscrolling (or is it something else causing the glitch on the hi-score screen of hangonjr, seems to be .. */
|
||||
|
||||
UINT8 hscroll;
|
||||
UINT8 vscroll;
|
||||
UINT16 tmbase;
|
||||
UINT8 tilesline, tilesline2;
|
||||
UINT8 coloffset, coloffset2;
|
||||
UINT8 loopcount;
|
||||
|
||||
hscroll = (256-segae_vdp_regs[chip][8]);
|
||||
vscroll = segae_vdp_regs[chip][9];
|
||||
if (vscroll > 224) vscroll %= 224;
|
||||
|
||||
tmbase = (segae_vdp_regs[chip][2] & 0x0e) << 10;
|
||||
tmbase += (segae_vdp_vrambank[chip] * 0x4000);
|
||||
|
||||
tilesline = (line + vscroll) >> 3;
|
||||
tilesline2= (line + vscroll) % 8;
|
||||
|
||||
|
||||
coloffset = (hscroll >> 3);
|
||||
coloffset2= (hscroll % 8);
|
||||
|
||||
dest -= coloffset2;
|
||||
|
||||
for (loopcount=0;loopcount<33;loopcount++) {
|
||||
|
||||
UINT16 vram_offset, vram_word;
|
||||
UINT16 tile_no;
|
||||
UINT8 palette, priority, flipx, flipy;
|
||||
|
||||
vram_offset = tmbase
|
||||
+ (2 * (32*tilesline + ((coloffset+loopcount)&0x1f) ) );
|
||||
vram_word = segae_vdp_vram[chip][vram_offset] | (segae_vdp_vram[chip][vram_offset+1] << 8);
|
||||
|
||||
tile_no = (vram_word & 0x01ff);
|
||||
flipx = (vram_word & 0x0200) >> 9;
|
||||
flipy = (vram_word & 0x0400) >> 10;
|
||||
palette = (vram_word & 0x0800) >> 11;
|
||||
priority= (vram_word & 0x1000) >> 12;
|
||||
|
||||
tilesline2= (line + vscroll) % 8;
|
||||
if (flipy) tilesline2 = 7-tilesline2;
|
||||
|
||||
if (priority == pri) {
|
||||
if (chip == 0) draw_8pix_solid16(dest, chip, tile_no,tilesline2,flipx,palette);
|
||||
else draw_8pix(dest, chip, tile_no,tilesline2,flipx,palette);
|
||||
}
|
||||
dest+=8;
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_sprite_line(UINT8 *dest, UINT8 chip, UINT8 line)
|
||||
{
|
||||
int nosprites;
|
||||
int loopcount;
|
||||
|
||||
UINT16 spritebase;
|
||||
|
||||
nosprites = 63; // if there is no end marker we draw everything (ridleofp)
|
||||
|
||||
spritebase = (segae_vdp_regs[chip][5] & 0x7e) << 7;
|
||||
spritebase += (segae_vdp_vrambank[chip] * 0x4000);
|
||||
|
||||
/*- find out how many sprites there are -*/
|
||||
|
||||
for (loopcount=0;loopcount<64;loopcount++) {
|
||||
UINT8 ypos;
|
||||
|
||||
ypos = segae_vdp_vram[chip][spritebase+loopcount];
|
||||
|
||||
if (ypos==208) {
|
||||
nosprites=loopcount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*- draw sprites IN REVERSE ORDER -*/
|
||||
|
||||
for (loopcount = nosprites; loopcount >= 0;loopcount--) {
|
||||
int ypos;
|
||||
UINT8 sheight;
|
||||
|
||||
ypos = segae_vdp_vram[chip][spritebase+loopcount] +1;
|
||||
|
||||
if (segae_vdp_regs[chip][1] & 0x02) sheight=16; else sheight=8;
|
||||
|
||||
if ( (line >= ypos) && (line < ypos+sheight) ) {
|
||||
int xpos;
|
||||
UINT16 sprnum;
|
||||
UINT8 spline;
|
||||
|
||||
spline = line - ypos;
|
||||
|
||||
xpos = segae_vdp_vram[chip][spritebase+0x80+ (2*loopcount)];
|
||||
sprnum = segae_vdp_vram[chip][spritebase+0x81+ (2*loopcount)];
|
||||
|
||||
if (segae_vdp_regs[chip][6] & 0x04)
|
||||
sprnum += 0x100;
|
||||
|
||||
draw_8pix_sprite(dest+xpos, chip, sprnum, spline);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_8pix_solid16(UINT8 *dest, UINT8 chip, UINT16 tile, UINT8 line, UINT8 flipx, UINT8 col)
|
||||
{
|
||||
|
||||
UINT32 pix8 = *(UINT32 *)&segae_vdp_vram[chip][(32)*tile + (4)*line + (0x4000) * segae_vdp_vrambank[chip]];
|
||||
UINT8 pix, coladd;
|
||||
|
||||
if (!pix8 && !col) return; /*note only the colour 0 of each vdp is transparent NOT colour 16???, fixes sky in HangonJr */
|
||||
|
||||
coladd = 16*col;
|
||||
|
||||
if (flipx) {
|
||||
pix = ((pix8 >> 0) & 0x01) | ((pix8 >> 7) & 0x02) | ((pix8 >> 14) & 0x04) | ((pix8 >> 21) & 0x08) ; pix+= coladd ; if (pix) dest[0] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 1) & 0x01) | ((pix8 >> 8) & 0x02) | ((pix8 >> 15) & 0x04) | ((pix8 >> 22) & 0x08) ; pix+= coladd ; if (pix) dest[1] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 2) & 0x01) | ((pix8 >> 9) & 0x02) | ((pix8 >> 16) & 0x04) | ((pix8 >> 23) & 0x08) ; pix+= coladd ; if (pix) dest[2] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 3) & 0x01) | ((pix8 >>10) & 0x02) | ((pix8 >> 17) & 0x04) | ((pix8 >> 24) & 0x08) ; pix+= coladd ; if (pix) dest[3] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 4) & 0x01) | ((pix8 >>11) & 0x02) | ((pix8 >> 18) & 0x04) | ((pix8 >> 25) & 0x08) ; pix+= coladd ; if (pix) dest[4] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 5) & 0x01) | ((pix8 >>12) & 0x02) | ((pix8 >> 19) & 0x04) | ((pix8 >> 26) & 0x08) ; pix+= coladd ; if (pix) dest[5] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 6) & 0x01) | ((pix8 >>13) & 0x02) | ((pix8 >> 20) & 0x04) | ((pix8 >> 27) & 0x08) ; pix+= coladd ; if (pix) dest[6] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 7) & 0x01) | ((pix8 >>14) & 0x02) | ((pix8 >> 21) & 0x04) | ((pix8 >> 28) & 0x08) ; pix+= coladd ; if (pix) dest[7] = pix+ 32*chip;
|
||||
} else {
|
||||
pix = ((pix8 >> 7) & 0x01) | ((pix8 >>14) & 0x02) | ((pix8 >> 21) & 0x04) | ((pix8 >> 28) & 0x08) ; pix+= coladd ; if (pix) dest[0] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 6) & 0x01) | ((pix8 >>13) & 0x02) | ((pix8 >> 20) & 0x04) | ((pix8 >> 27) & 0x08) ; pix+= coladd ; if (pix) dest[1] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 5) & 0x01) | ((pix8 >>12) & 0x02) | ((pix8 >> 19) & 0x04) | ((pix8 >> 26) & 0x08) ; pix+= coladd ; if (pix) dest[2] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 4) & 0x01) | ((pix8 >>11) & 0x02) | ((pix8 >> 18) & 0x04) | ((pix8 >> 25) & 0x08) ; pix+= coladd ; if (pix) dest[3] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 3) & 0x01) | ((pix8 >>10) & 0x02) | ((pix8 >> 17) & 0x04) | ((pix8 >> 24) & 0x08) ; pix+= coladd ; if (pix) dest[4] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 2) & 0x01) | ((pix8 >> 9) & 0x02) | ((pix8 >> 16) & 0x04) | ((pix8 >> 23) & 0x08) ; pix+= coladd ; if (pix) dest[5] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 1) & 0x01) | ((pix8 >> 8) & 0x02) | ((pix8 >> 15) & 0x04) | ((pix8 >> 22) & 0x08) ; pix+= coladd ; if (pix) dest[6] = pix+ 32*chip;
|
||||
pix = ((pix8 >> 0) & 0x01) | ((pix8 >> 7) & 0x02) | ((pix8 >> 14) & 0x04) | ((pix8 >> 21) & 0x08) ; pix+= coladd ; if (pix) dest[7] = pix+ 32*chip;
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_8pix(UINT8 *dest, UINT8 chip, UINT16 tile, UINT8 line, UINT8 flipx, UINT8 col)
|
||||
{
|
||||
|
||||
UINT32 pix8 = *(UINT32 *)&segae_vdp_vram[chip][(32)*tile + (4)*line + (0x4000) * segae_vdp_vrambank[chip]];
|
||||
UINT8 pix, coladd;
|
||||
|
||||
if (!pix8) return;
|
||||
|
||||
coladd = 16*col+32*chip;
|
||||
|
||||
if (flipx) {
|
||||
pix = ((pix8 >> 0) & 0x01) | ((pix8 >> 7) & 0x02) | ((pix8 >> 14) & 0x04) | ((pix8 >> 21) & 0x08) ; if (pix) dest[0] = pix+ coladd;
|
||||
pix = ((pix8 >> 1) & 0x01) | ((pix8 >> 8) & 0x02) | ((pix8 >> 15) & 0x04) | ((pix8 >> 22) & 0x08) ; if (pix) dest[1] = pix+ coladd;
|
||||
pix = ((pix8 >> 2) & 0x01) | ((pix8 >> 9) & 0x02) | ((pix8 >> 16) & 0x04) | ((pix8 >> 23) & 0x08) ; if (pix) dest[2] = pix+ coladd;
|
||||
pix = ((pix8 >> 3) & 0x01) | ((pix8 >>10) & 0x02) | ((pix8 >> 17) & 0x04) | ((pix8 >> 24) & 0x08) ; if (pix) dest[3] = pix+ coladd;
|
||||
pix = ((pix8 >> 4) & 0x01) | ((pix8 >>11) & 0x02) | ((pix8 >> 18) & 0x04) | ((pix8 >> 25) & 0x08) ; if (pix) dest[4] = pix+ coladd;
|
||||
pix = ((pix8 >> 5) & 0x01) | ((pix8 >>12) & 0x02) | ((pix8 >> 19) & 0x04) | ((pix8 >> 26) & 0x08) ; if (pix) dest[5] = pix+ coladd;
|
||||
pix = ((pix8 >> 6) & 0x01) | ((pix8 >>13) & 0x02) | ((pix8 >> 20) & 0x04) | ((pix8 >> 27) & 0x08) ; if (pix) dest[6] = pix+ coladd;
|
||||
pix = ((pix8 >> 7) & 0x01) | ((pix8 >>14) & 0x02) | ((pix8 >> 21) & 0x04) | ((pix8 >> 28) & 0x08) ; if (pix) dest[7] = pix+ coladd;
|
||||
} else {
|
||||
pix = ((pix8 >> 7) & 0x01) | ((pix8 >>14) & 0x02) | ((pix8 >> 21) & 0x04) | ((pix8 >> 28) & 0x08) ; if (pix) dest[0] = pix+ coladd;
|
||||
pix = ((pix8 >> 6) & 0x01) | ((pix8 >>13) & 0x02) | ((pix8 >> 20) & 0x04) | ((pix8 >> 27) & 0x08) ; if (pix) dest[1] = pix+ coladd;
|
||||
pix = ((pix8 >> 5) & 0x01) | ((pix8 >>12) & 0x02) | ((pix8 >> 19) & 0x04) | ((pix8 >> 26) & 0x08) ; if (pix) dest[2] = pix+ coladd;
|
||||
pix = ((pix8 >> 4) & 0x01) | ((pix8 >>11) & 0x02) | ((pix8 >> 18) & 0x04) | ((pix8 >> 25) & 0x08) ; if (pix) dest[3] = pix+ coladd;
|
||||
pix = ((pix8 >> 3) & 0x01) | ((pix8 >>10) & 0x02) | ((pix8 >> 17) & 0x04) | ((pix8 >> 24) & 0x08) ; if (pix) dest[4] = pix+ coladd;
|
||||
pix = ((pix8 >> 2) & 0x01) | ((pix8 >> 9) & 0x02) | ((pix8 >> 16) & 0x04) | ((pix8 >> 23) & 0x08) ; if (pix) dest[5] = pix+ coladd;
|
||||
pix = ((pix8 >> 1) & 0x01) | ((pix8 >> 8) & 0x02) | ((pix8 >> 15) & 0x04) | ((pix8 >> 22) & 0x08) ; if (pix) dest[6] = pix+ coladd;
|
||||
pix = ((pix8 >> 0) & 0x01) | ((pix8 >> 7) & 0x02) | ((pix8 >> 14) & 0x04) | ((pix8 >> 21) & 0x08) ; if (pix) dest[7] = pix+ coladd;
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_8pix_sprite(UINT8 *dest, UINT8 chip, UINT16 tile, UINT8 line)
|
||||
{
|
||||
|
||||
UINT32 pix8 = *(UINT32 *)&segae_vdp_vram[chip][(32)*tile + (4)*line + (0x4000) * segae_vdp_vrambank[chip]];
|
||||
UINT8 pix;
|
||||
|
||||
if (!pix8) return; /*note only the colour 0 of each vdp is transparent NOT colour 16, fixes sky in HangonJr */
|
||||
|
||||
pix = ((pix8 >> 7) & 0x01) | ((pix8 >>14) & 0x02) | ((pix8 >> 21) & 0x04) | ((pix8 >> 28) & 0x08) ; if (pix) dest[0] = pix+16+32*chip;
|
||||
pix = ((pix8 >> 6) & 0x01) | ((pix8 >>13) & 0x02) | ((pix8 >> 20) & 0x04) | ((pix8 >> 27) & 0x08) ; if (pix) dest[1] = pix+16+32*chip;
|
||||
pix = ((pix8 >> 5) & 0x01) | ((pix8 >>12) & 0x02) | ((pix8 >> 19) & 0x04) | ((pix8 >> 26) & 0x08) ; if (pix) dest[2] = pix+16+32*chip;
|
||||
pix = ((pix8 >> 4) & 0x01) | ((pix8 >>11) & 0x02) | ((pix8 >> 18) & 0x04) | ((pix8 >> 25) & 0x08) ; if (pix) dest[3] = pix+16+32*chip;
|
||||
pix = ((pix8 >> 3) & 0x01) | ((pix8 >>10) & 0x02) | ((pix8 >> 17) & 0x04) | ((pix8 >> 24) & 0x08) ; if (pix) dest[4] = pix+16+32*chip;
|
||||
pix = ((pix8 >> 2) & 0x01) | ((pix8 >> 9) & 0x02) | ((pix8 >> 16) & 0x04) | ((pix8 >> 23) & 0x08) ; if (pix) dest[5] = pix+16+32*chip;
|
||||
pix = ((pix8 >> 1) & 0x01) | ((pix8 >> 8) & 0x02) | ((pix8 >> 15) & 0x04) | ((pix8 >> 22) & 0x08) ; if (pix) dest[6] = pix+16+32*chip;
|
||||
pix = ((pix8 >> 0) & 0x01) | ((pix8 >> 7) & 0x02) | ((pix8 >> 14) & 0x04) | ((pix8 >> 21) & 0x08) ; if (pix) dest[7] = pix+16+32*chip;
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user