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:
Fabio Priuli 2009-10-01 21:47:09 +00:00
parent 2fdb170abc
commit b3adef6de8
11 changed files with 2034 additions and 2184 deletions

2
.gitattributes vendored
View File

@ -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/halleys.c svneol=native#text/plain
src/mame/drivers/hanaawas.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/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/hcastle.c svneol=native#text/plain
src/mame/drivers/hexa.c svneol=native#text/plain src/mame/drivers/hexa.c svneol=native#text/plain
src/mame/drivers/hexion.c svneol=native#text/plain src/mame/drivers/hexion.c svneol=native#text/plain

1756
src/mame/drivers/hazemd_s.c Normal file

File diff suppressed because it is too large Load Diff

View 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;

View File

@ -1775,23 +1775,6 @@ UINT8 megatech_bios_port_cc_dc_r(running_machine *machine, int offset, int ctrl)
return retdata; 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) static UINT8 megadrive_io_read_ctrl_port(int portnum)
{ {
UINT8 retdata; UINT8 retdata;
@ -6387,33 +6370,33 @@ static WRITE8_HANDLER( z80_unmapped_w )
/* sets the megadrive z80 to it's normal ports / map */ /* 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"); const device_config *ym = devtag_get_device(machine, "ym");
/* INIT THE PORTS *********************************************************************************************/ /* 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 */ /* 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_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 ); memory_set_bankptr(machine, 6, genz80.z80_prgram );
// not allowed?? // 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_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, "genesis_snd_z80", 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), 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_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, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x6100, 0x7eff, 0, 0, megadriv_z80_unmapped_read); 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, "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, 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, "genesis_snd_z80", ADDRESS_SPACE_PROGRAM), 0x8000, 0xffff, 0, 0, z80_read_68k_banked_data, z80_write_68k_banked_data); 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 // these are tests for 'special case' hardware to make sure I don't break anything while rearranging things

View File

@ -25,7 +25,7 @@ extern UINT16* megadrive_ram;
extern UINT8 megatech_bios_port_cc_dc_r(running_machine *machine, int offset, int ctrl); extern UINT8 megatech_bios_port_cc_dc_r(running_machine *machine, int offset, int ctrl);
extern void megadriv_stop_scanline_timer(void); 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_dc_r);
extern READ8_HANDLER (megatech_sms_ioport_dd_r); extern READ8_HANDLER (megatech_sms_ioport_dd_r);

View File

@ -1,7 +1,11 @@
/* Sega MegaPlay /* Sega MegaPlay
changelog: 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, 22 Sept 2007 - Started updating this to use the new Megadrive code,
fixing issues with Mazin Wars + Grand Slam. fixing issues with Mazin Wars + Grand Slam.
However I'm still not convinced that the handling of 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. 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" #include "driver.h"
@ -46,6 +56,7 @@ Only a handful of games were released for this system.
#include "deprecat.h" #include "deprecat.h"
#include "genesis.h" #include "genesis.h"
#include "megadriv.h" #include "megadriv.h"
#include "hazemd_s.h"
#define MASTER_CLOCK 53693100 #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 UINT32 bios_bank; // ROM bank selection
static UINT16 game_banksel; // Game bank selection static UINT16 game_banksel; // Game bank selection
static UINT32 bios_mode = MP_ROM; // determines whether ROM banks or Game data 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 static UINT32 bios_width; // determines the way the game info ROM is read
UINT8 bios_ctrl[6]; UINT8 bios_ctrl[6];
static UINT8 bios_6600; static UINT8 bios_6600;
@ -71,12 +84,13 @@ UINT16 *ic36_ram;
//static UINT8 ic36_ram[0x4000]; //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_vintpending;
extern UINT8 segae_hintpending; extern UINT8 segae_hintpending;
extern UINT8 *segae_vdp_regs[]; /* pointer to vdp's registers */ extern UINT8 *segae_vdp_regs[]; /* pointer to vdp's registers */
// Interrupt handler - from drivers/segasyse.c // Interrupt handler - from drivers/segasyse.c
#if 0
static INTERRUPT_GEN (megaplay_bios_irq) static INTERRUPT_GEN (megaplay_bios_irq)
{ {
int sline; int sline;
@ -116,7 +130,7 @@ static INTERRUPT_GEN (megaplay_bios_irq)
} }
} }
#endif
static UINT32 readpos = 1; // serial bank selection position (9-bit) 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 ) static READ8_HANDLER( bank_r )
{ {
UINT8* bank = memory_region(space->machine, "mpbios"); UINT32 fulladdress;
UINT8* game = memory_region(space->machine, "maincpu"); UINT8* bank = memory_region(space->machine, "mtbios");
if(game_banksel == 0x142) // Genesis I/O fulladdress = mp_bios_bank_addr + offset;
return OLD_megaplay_genesis_io_r(space, (offset & 0x1f) / 2, 0xffff);
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) else
return 0xff; 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 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 else
{ {
if(game_banksel == 0x60 || game_banksel == 0x61) /* read game info ROM */ printf("bank_r fulladdress %08x\n",fulladdress);
if(bios_width & 0x08) return 0x00;
{
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))];
} }
} }
static WRITE8_HANDLER ( bank_w ) 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); OLD_megaplay_genesis_io_w(space, (offset & 0x1f) / 2, data, 0xffff);
}
if(offset <= 0x1fff && (bios_width & 0x08)) else
ic37_ram[(0x2000 * (bios_bank & 0x03)) + offset] = data; {
printf("bank_w fulladdress %08x\n",fulladdress);
if(offset >= 0x2000 && (bios_width & 0x08)) }
// ic36_ram[offset] = data;
ic36_ram[offset - 0x2000] = data;
} }
@ -686,6 +722,10 @@ static WRITE8_HANDLER( megaplay_game_w )
// popmessage("Game bank selected: 0x%03x",game_banksel); // 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); 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 ) 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_ctrl_w ( UINT8 chip, UINT8 data );
void segae_vdp_data_w ( running_machine *machine, 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) static READ8_HANDLER (megaplay_bios_port_be_bf_r)
{ {
UINT8 temp = 0; UINT8 temp = 0;
@ -738,38 +779,48 @@ static WRITE8_HANDLER (megaplay_bios_port_be_bf_w)
segae_vdp_ctrl_w(0, data); break; segae_vdp_ctrl_w(0, data); break;
} }
} }
#endif
static ADDRESS_MAP_START( megaplay_bios_io_map, ADDRESS_SPACE_IO, 8 ) static ADDRESS_MAP_START( megaplay_bios_io_map, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_GLOBAL_MASK(0xff) 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(0x7f, 0x7f) AM_DEVWRITE("sn2", sn76496_w) /* SN76489 */
// AM_RANGE(0xdc, 0xdc) AM_READ(megatech_bios_port_dc_r) // player inputs AM_RANGE(0xbe, 0xbe) AM_READWRITE(sms_vdp_data_r, sms_vdp_data_w) /* VDP */
// AM_RANGE(0xdd, 0xdd) AM_READ(megatech_bios_port_dd_r) // other player 2 inputs AM_RANGE(0xbf, 0xbf) AM_READWRITE(sms_vdp_ctrl_r, sms_vdp_ctrl_w) /* VDP */
AM_RANGE(0xbe, 0xbf) AM_READWRITE(megaplay_bios_port_be_bf_r, megaplay_bios_port_be_bf_w) /* VDP */
ADDRESS_MAP_END ADDRESS_MAP_END
/* in video/segasyse.c */
VIDEO_START( megaplay_normal );
VIDEO_UPDATE( megaplay_normal );
static VIDEO_START(megplay) static VIDEO_START(megplay)
{ {
//printf("megplay vs\n"); //printf("megplay vs\n");
VIDEO_START_CALL(megadriv); VIDEO_START_CALL(megadriv);
VIDEO_START_CALL(megaplay_normal); // VIDEO_START_CALL(megaplay_normal);
} }
static VIDEO_UPDATE(megplay) static VIDEO_UPDATE(megplay)
{ {
//printf("megplay vu\n"); //printf("megplay vu\n");
VIDEO_UPDATE_CALL(megadriv); VIDEO_UPDATE_CALL(megadriv);
VIDEO_UPDATE_CALL(megaplay_normal); // VIDEO_UPDATE_CALL(megaplay_normal);
VIDEO_UPDATE_CALL(megaplay_bios);
return 0; return 0;
} }
//extern VIDEO_EOF(megadriv); //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 ) static MACHINE_DRIVER_START( mpnew )
@ -778,11 +829,14 @@ static MACHINE_DRIVER_START( mpnew )
/* The Megaplay has an extra BIOS cpu which drives an SMS VDP /* The Megaplay has an extra BIOS cpu which drives an SMS VDP
which includes an SN76496 for sound */ 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_PROGRAM_MAP(megaplay_bios_map)
MDRV_CPU_IO_MAP(megaplay_bios_io_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)) MDRV_QUANTUM_TIME(HZ(6000))
MDRV_SOUND_ADD("sn2", SN76496, MASTER_CLOCK/15) MDRV_SOUND_ADD("sn2", SN76496, MASTER_CLOCK/15)
@ -811,10 +865,16 @@ ROM_START( megaplay )
ROM_REGION( 0x8000, "user1", ROMREGION_ERASEFF ) ROM_REGION( 0x8000, "user1", ROMREGION_ERASEFF )
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */ ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
MEGAPLAY_BIOS MEGAPLAY_BIOS
ROM_END 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_START( mp_sonic ) /* Sonic */
ROM_REGION( 0x400000, "maincpu", 0 ) ROM_REGION( 0x400000, "maincpu", 0 )
ROM_LOAD16_BYTE( "ep15177.ic2", 0x000000, 0x040000, CRC(a389b03b) SHA1(8e9e1cf3dd65ddf08757f5a1ce472130c902ea2c) ) 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_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "ep15175-01.ic3", 0x000000, 0x08000, CRC(99246889) SHA1(184aa3b7fdedcf578c5e34edb7ed44f57f832258) ) 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 MEGAPLAY_BIOS
ROM_END ROM_END
@ -840,7 +900,7 @@ ROM_START( mp_col3 ) /* Columns 3 */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "1.ic3", 0x000000, 0x08000, CRC(dac9bf91) SHA1(0117972a7181f8aaf942a259cc8764b821031253) ) ROM_LOAD( "1.ic3", 0x000000, 0x08000, CRC(dac9bf91) SHA1(0117972a7181f8aaf942a259cc8764b821031253) )
ROM_REGION( 0x28000, "mpbios", 0 ) /* Bios */ ROM_REGION( 0x28000, "mtbios", 0 ) /* Bios */
MEGAPLAY_BIOS MEGAPLAY_BIOS
ROM_END ROM_END
@ -853,7 +913,7 @@ ROM_START( mp_gaxe2 ) /* Golden Axe 2 */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "ep15175-02b.ic3", 0x000000, 0x08000, CRC(3039b653) SHA1(b19874c74d0fc0cca1169f62e5e74f0e8ca83679) ) // 15175-02b.ic3 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 MEGAPLAY_BIOS
ROM_END ROM_END
@ -866,7 +926,7 @@ ROM_START( mp_gslam ) /* Grand Slam */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "epr-15175-03.ic3", 0x000000, 0x08000, CRC(70ea1aec) SHA1(0d9d82a1f8aa51d02707f7b343e7cfb6591efccd) ) // 15175-02b.ic3 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 MEGAPLAY_BIOS
ROM_END ROM_END
@ -880,7 +940,7 @@ ROM_START( mp_twc ) /* Tecmo World Cup */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "ep15175-04.ic3", 0x000000, 0x08000, CRC(faf7c030) SHA1(16ef405335b4d3ecb0b7d97b088dafc4278d4726) ) 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 MEGAPLAY_BIOS
ROM_END ROM_END
@ -892,7 +952,7 @@ ROM_START( mp_sor2 ) /* Streets of Rage 2 */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "epr-15175-05.ic2", 0x000000, 0x08000, CRC(1df5347c) SHA1(faced2e875e1914392f61577b5256d006eebeef9) ) 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 MEGAPLAY_BIOS
ROM_END ROM_END
@ -904,7 +964,7 @@ ROM_START( mp_bio ) /* Bio Hazard Battle */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "epr-15175-06.ic2", 0x000000, 0x08000, CRC(1ef64e41) SHA1(13984b714b014ea41963b70de74a5358ed223bc5) ) 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 MEGAPLAY_BIOS
ROM_END ROM_END
@ -916,7 +976,7 @@ ROM_START( mp_soni2 ) /* Sonic The Hedgehog 2 */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "epr-15175-07.ic1", 0x000000, 0x08000, CRC(bb5f67f0) SHA1(33b7a5d14015a5fcf41976a8f648f8f48ce9bb03) ) 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 MEGAPLAY_BIOS
ROM_END ROM_END
@ -928,7 +988,7 @@ ROM_START( mp_mazin ) /* Mazin Wars */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "epr-15175-11.ic2", 0x000000, 0x08000, CRC(bb651120) SHA1(81cb736f2732373e260dde162249c1d29a3489c3) ) 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 MEGAPLAY_BIOS
ROM_END ROM_END
@ -940,14 +1000,14 @@ ROM_START( mp_shnb3 ) /* Shinobi 3 */
ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */
ROM_LOAD( "epr-15175-09.ic2", 0x000000, 0x08000, CRC(6254e45a) SHA1(8667922a6eade03c964ce224f7fa39ba871c60a4) ) 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 MEGAPLAY_BIOS
ROM_END ROM_END
static void megplay_stat(running_machine *machine) 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 *instruction_rom = memory_region(machine, "user1");
UINT8 *game_rom = memory_region(machine, "maincpu"); UINT8 *game_rom = memory_region(machine, "maincpu");
int offs; 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 */ /* 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); 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.
} }
/* /*

View File

@ -91,7 +91,7 @@ Sonic Hedgehog 2 171-6215A 837-6963-62 610-0239-62 MPR
#include "sound/sn76496.h" #include "sound/sn76496.h"
#include "rendlay.h" #include "rendlay.h"
#include "segae.h" #include "hazemd_s.h"
#include "genesis.h" #include "genesis.h"
#include "megadriv.h" #include "megadriv.h"
@ -248,59 +248,6 @@ static READ8_HANDLER( megatech_cart_select_r )
return (mt_cart_select_reg); 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 #ifdef UNUSED_FUNCTION
READ8_HANDLER( md_sms_ioport_dc_r ) 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) 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"); printf("SMS cart!!, CPU not running\n");
current_game_is_sms = 1; 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_HALT, CLEAR_LINE);
cputag_set_input_line(machine, "genesis_snd_z80", INPUT_LINE_RESET, 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"); printf("Genesis Cart, CPU0 running\n");
current_game_is_sms = 0; 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_RESET, CLEAR_LINE);
cputag_set_input_line(machine, "maincpu", INPUT_LINE_HALT, CLEAR_LINE); cputag_set_input_line(machine, "maincpu", INPUT_LINE_HALT, CLEAR_LINE);
} }

File diff suppressed because it is too large Load Diff

View File

@ -1128,7 +1128,7 @@ $(MAMEOBJ)/sega.a: \
$(DRIVERS)/segas18.o $(VIDEO)/segas18.o \ $(DRIVERS)/segas18.o $(VIDEO)/segas18.o \
$(DRIVERS)/segas24.o $(MACHINE)/segas24.o $(VIDEO)/segas24.o \ $(DRIVERS)/segas24.o $(MACHINE)/segas24.o $(VIDEO)/segas24.o \
$(DRIVERS)/segas32.o $(MACHINE)/segas32.o $(VIDEO)/segas32.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)/segaxbd.o $(VIDEO)/segaxbd.o \
$(DRIVERS)/segaybd.o $(VIDEO)/segaybd.o \ $(DRIVERS)/segaybd.o $(VIDEO)/segaybd.o \
$(DRIVERS)/ssf2md.o \ $(DRIVERS)/ssf2md.o \

View File

@ -12,9 +12,6 @@
#include "genesis.h" #include "genesis.h"
/* in video/segasyse.c */
VIDEO_START( megaplay_normal );
VIDEO_UPDATE( megaplay_normal );
static const device_config *genesis_screen; static const device_config *genesis_screen;
@ -279,6 +276,7 @@ VIDEO_UPDATE( segac2 )
/* megaplay, draws either Genesis or SMS (single screen display) */ /* megaplay, draws either Genesis or SMS (single screen display) */
/* core refresh: computes the final screen */ /* core refresh: computes the final screen */
#if 0
VIDEO_UPDATE( megaplay ) VIDEO_UPDATE( megaplay )
{ {
int y; int y;
@ -287,10 +285,11 @@ VIDEO_UPDATE( megaplay )
for (y = cliprect->min_y; y <= cliprect->max_y; y++) for (y = cliprect->min_y; y <= cliprect->max_y; y++)
drawline(BITMAP_ADDR16(bitmap, y, 0), y, 0); drawline(BITMAP_ADDR16(bitmap, y, 0), y, 0);
VIDEO_UPDATE_CALL(megaplay_normal); //VIDEO_UPDATE_CALL(megaplay_normal);
return 0; return 0;
} }
#endif
void system18_vdp_update( bitmap_t *bitmap, const rectangle *cliprect ) void system18_vdp_update( bitmap_t *bitmap, const rectangle *cliprect )
{ {

View File

@ -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;
}