konamigx: small cleanup to spacing

This commit is contained in:
hap 2025-04-01 13:49:41 +02:00
parent 7feaa6968d
commit 90b86c79b6
5 changed files with 319 additions and 323 deletions

View File

@ -187,7 +187,8 @@
- Tokimeki Memorial: wrong horizontal flip for mode select arrows; - Tokimeki Memorial: wrong horizontal flip for mode select arrows;
*/ */
static struct sprite_entry { static struct sprite_entry
{
int pri; int pri;
uint32_t adr; uint32_t adr;
} sprites[0x100]; } sprites[0x100];
@ -197,14 +198,16 @@ void konamigx_state::generate_sprites(address_space &space, uint32_t src, uint32
int scount = 0; int scount = 0;
int ecount = 0; int ecount = 0;
for(int i=0; i<count; i++) { for (int i = 0; i < count; i++)
{
uint32_t adr = src + 0x100*i; uint32_t adr = src + 0x100*i;
int pri; int pri;
if(!space.read_word(adr+2)) if (!space.read_word(adr+2))
continue; continue;
pri = space.read_word(adr+28); pri = space.read_word(adr+28);
if(pri < 256) { if (pri < 256)
{
sprites[ecount].pri = pri; sprites[ecount].pri = pri;
sprites[ecount].adr = adr; sprites[ecount].adr = adr;
ecount++; ecount++;
@ -212,9 +215,11 @@ void konamigx_state::generate_sprites(address_space &space, uint32_t src, uint32
} }
//qsort(sprites, ecount, sizeof(struct sprite_entry), pri_comp); //qsort(sprites, ecount, sizeof(struct sprite_entry), pri_comp);
for(int i=0; i<ecount; i++) { for (int i = 0; i < ecount; i++)
{
uint32_t adr = sprites[i].adr; uint32_t adr = sprites[i].adr;
if(adr) { if (adr)
{
uint32_t set =(space.read_word(adr) << 16)|space.read_word(adr+2); uint32_t set =(space.read_word(adr) << 16)|space.read_word(adr+2);
uint16_t glob_x = space.read_word(adr+4); uint16_t glob_x = space.read_word(adr+4);
uint16_t glob_y = space.read_word(adr+8); uint16_t glob_y = space.read_word(adr+8);
@ -230,77 +235,82 @@ void konamigx_state::generate_sprites(address_space &space, uint32_t src, uint32
uint16_t v; uint16_t v;
v = space.read_word(adr+24); v = space.read_word(adr+24);
if(v & 0x8000) { if (v & 0x8000)
{
color_mask = 0xf3ff; color_mask = 0xf3ff;
color_val |= (v & 3) << 10; color_val |= (v & 3) << 10;
} }
v = space.read_word(adr+26); v = space.read_word(adr+26);
if(v & 0x8000) { if (v & 0x8000)
{
color_mask &= 0xfcff; color_mask &= 0xfcff;
color_val |= (v & 3) << 8; color_val |= (v & 3) << 8;
} }
v = space.read_word(adr+18); v = space.read_word(adr+18);
if(v & 0x8000) { if (v & 0x8000)
{
color_mask &= 0xff1f; color_mask &= 0xff1f;
color_val |= v & 0xe0; color_val |= v & 0xe0;
} }
v = space.read_word(adr+16); v = space.read_word(adr+16);
if(v & 0x8000) if (v & 0x8000)
color_set = v & 0x1f; color_set = v & 0x1f;
if(v & 0x4000) if (v & 0x4000)
color_rotate = v & 0x1f; color_rotate = v & 0x1f;
if(!zoom_x) if (!zoom_x)
zoom_x = 0x40; zoom_x = 0x40;
if(!zoom_y) if (!zoom_y)
zoom_y = 0x40; zoom_y = 0x40;
if(set >= 0x200000 && set < 0xd00000) if (set >= 0x200000 && set < 0xd00000)
{ {
uint16_t count2 = space.read_word(set); uint16_t count2 = space.read_word(set);
set += 2; set += 2;
while(count2) { while(count2)
{
uint16_t idx = space.read_word(set); uint16_t idx = space.read_word(set);
uint16_t flip = space.read_word(set+2); uint16_t flip = space.read_word(set+2);
uint16_t col = space.read_word(set+4); uint16_t col = space.read_word(set+4);
short y = space.read_word(set+6); short y = space.read_word(set+6);
short x = space.read_word(set+8); short x = space.read_word(set+8);
if(idx == 0xffff) { if (idx == 0xffff)
{
set = (flip<<16) | col; set = (flip<<16) | col;
if(set >= 0x200000 && set < 0xd00000) if (set >= 0x200000 && set < 0xd00000)
continue; continue;
else else
break; break;
} }
if(zoom_y != 0x40) if (zoom_y != 0x40)
y = y*0x40/zoom_y; y = y*0x40/zoom_y;
if(zoom_x != 0x40) if (zoom_x != 0x40)
x = x*0x40/zoom_x; x = x*0x40/zoom_x;
if(flip_x) if (flip_x)
x = glob_x - x; x = glob_x - x;
else else
x = glob_x + x; x = glob_x + x;
if(x < -256 || x > 512+32) if (x < -256 || x > 512+32)
goto next; goto next;
if(flip_y) if (flip_y)
y = glob_y - y; y = glob_y - y;
else else
y = glob_y + y; y = glob_y + y;
if(y < -256 || y > 512) if (y < -256 || y > 512)
goto next; goto next;
col = (col & color_mask) | color_val; col = (col & color_mask) | color_val;
if(color_set) if (color_set)
col = (col & 0xffe0) | color_set; col = (col & 0xffe0) | color_set;
if(color_rotate) if (color_rotate)
col = (col & 0xffe0) | ((col + color_rotate) & 0x1f); col = (col & 0xffe0) | ((col + color_rotate) & 0x1f);
space.write_word(spr , (flip ^ glob_f) | sprites[i].pri); space.write_word(spr , (flip ^ glob_f) | sprites[i].pri);
@ -312,7 +322,7 @@ void konamigx_state::generate_sprites(address_space &space, uint32_t src, uint32
space.write_word(spr+12, col); space.write_word(spr+12, col);
spr += 16; spr += 16;
scount++; scount++;
if(scount == 256) if (scount == 256)
return; return;
next: next:
count2--; count2--;
@ -321,7 +331,8 @@ void konamigx_state::generate_sprites(address_space &space, uint32_t src, uint32
} }
} }
} }
while(scount < 256) { while(scount < 256)
{
space.write_word(spr, scount); space.write_word(spr, scount);
scount++; scount++;
spr += 16; spr += 16;
@ -384,7 +395,7 @@ void konamigx_state::esc_w(address_space &space, uint32_t data)
} }
/* the master opcode can be at an unaligned address, so get it "safely" */ /* the master opcode can be at an unaligned address, so get it "safely" */
opcode = (space.read_word(data+2))|(space.read_word(data)<<16); opcode = (space.read_word(data+2)) | (space.read_word(data) << 16);
/* if there's an OBJECT_MAGIC_ID, that means /* if there's an OBJECT_MAGIC_ID, that means
there is a valid ESC command packet. */ there is a valid ESC command packet. */
@ -395,11 +406,12 @@ void konamigx_state::esc_w(address_space &space, uint32_t data)
opcode = space.read_byte(data+8); opcode = space.read_byte(data+8);
params = (space.read_word(data+12) << 16) | space.read_word(data+14); params = (space.read_word(data+12) << 16) | space.read_word(data+14);
switch(opcode) { switch (opcode)
{
case 5: // Reset case 5: // Reset
break; break;
case 2: // Load program case 2: // Load program
for(i=0; i<4096; i++) for (i = 0; i < 4096; i++)
m_esc_program[i] = space.read_byte(params+i); m_esc_program[i] = space.read_byte(params+i);
/* /*
{ {
@ -414,7 +426,8 @@ void konamigx_state::esc_w(address_space &space, uint32_t data)
*/ */
break; break;
case 1: // Run program case 1: // Run program
if(m_esc_cb) { if (m_esc_cb)
{
uint32_t p1 = (space.read_word(params+0)<<16) | space.read_word(params+2); uint32_t p1 = (space.read_word(params+0)<<16) | space.read_word(params+2);
uint32_t p2 = (space.read_word(params+4)<<16) | space.read_word(params+6); uint32_t p2 = (space.read_word(params+4)<<16) | space.read_word(params+6);
uint32_t p3 = (space.read_word(params+8)<<16) | space.read_word(params+10); uint32_t p3 = (space.read_word(params+8)<<16) | space.read_word(params+10);
@ -547,7 +560,7 @@ void konamigx_state::control_w(offs_t offset, uint32_t data, uint32_t mem_mask)
m_gx_wrport2 = (data>>16)&0xff; m_gx_wrport2 = (data>>16)&0xff;
if(m_prev_pixel_clock != (m_gx_wrport2 & 3)) if (m_prev_pixel_clock != (m_gx_wrport2 & 3))
{ {
m_k053252->set_unscaled_clock(pixclock[m_gx_wrport2 & 3]); m_k053252->set_unscaled_clock(pixclock[m_gx_wrport2 & 3]);
m_prev_pixel_clock = m_gx_wrport2 & 3; m_prev_pixel_clock = m_gx_wrport2 & 3;
@ -613,7 +626,7 @@ void konamigx_state::dmastart_callback(int data)
// simulate DMA delay // simulate DMA delay
// TODO: Rushing Heroes doesn't like reported sprite timings, probably due of sprite protection being issued istantly or requires the double buffering ... // TODO: Rushing Heroes doesn't like reported sprite timings, probably due of sprite protection being issued istantly or requires the double buffering ...
if(m_gx_rushingheroes_hack == 1) if (m_gx_rushingheroes_hack == 1)
sprite_timing = 64; sprite_timing = 64;
else else
sprite_timing = m_gx_wrport2 & 1 ? (256+32) : (342+42); sprite_timing = m_gx_wrport2 & 1 ? (256+32) : (342+42);
@ -650,7 +663,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(konamigx_state::konamigx_type2_scanline)
{ {
int scanline = param; int scanline = param;
if(scanline == 48) if (scanline == 48)
{ {
if (m_gx_syncen & 0x40) if (m_gx_syncen & 0x40)
{ {
@ -686,7 +699,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(konamigx_state::konamigx_type4_scanline)
// maybe this interrupt should only be every 30fps, or maybe there are flags to prevent the game running too fast // maybe this interrupt should only be every 30fps, or maybe there are flags to prevent the game running too fast
// the real hardware should output the display for each screen on alternate frames // the real hardware should output the display for each screen on alternate frames
// if(device->m_screen->frame_number() & 1) // if (device->m_screen->frame_number() & 1)
if (1) // m_gx_syncen & 0x20) if (1) // m_gx_syncen & 0x20)
{ {
m_gx_syncen &= ~0x20; m_gx_syncen &= ~0x20;
@ -701,7 +714,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(konamigx_state::konamigx_type4_scanline)
dmastart_callback(0); dmastart_callback(0);
} }
else if(scanline < 240) // hblank else if (scanline < 240) // hblank
{ {
// IRQ 2 is a programmable interrupt with scanline resolution // IRQ 2 is a programmable interrupt with scanline resolution
if (m_gx_syncen & 0x40) if (m_gx_syncen & 0x40)
@ -740,22 +753,22 @@ double konamigx_state::adc0834_callback(uint8_t input)
uint32_t konamigx_state::le2_gun_H_r() uint32_t konamigx_state::le2_gun_H_r()
{ {
int p1x = m_light0_x->read()*290/0xff+20; int p1x = m_light0_x->read()* 290 /0xff + 20;
int p2x = m_light1_x->read()*290/0xff+20; int p2x = m_light1_x->read()* 290 /0xff + 20;
return (p1x<<16)|p2x; return (p1x << 16) | p2x;
} }
uint32_t konamigx_state::le2_gun_V_r() uint32_t konamigx_state::le2_gun_V_r()
{ {
int p1y = m_light0_y->read()*224/0xff; int p1y = m_light0_y->read() * 224 / 0xff;
int p2y = m_light1_y->read()*224/0xff; int p2y = m_light1_y->read() * 224 / 0xff;
// make "off the bottom" reload too // make "off the bottom" reload too
if (p1y >= 0xdf) p1y = 0; if (p1y >= 0xdf) p1y = 0;
if (p2y >= 0xdf) p2y = 0; if (p2y >= 0xdf) p2y = 0;
return (p1y<<16)|p2y; return (p1y << 16) | p2y;
} }
/**********************************************************************************/ /**********************************************************************************/
@ -779,10 +792,10 @@ uint32_t konamigx_state::type1_roz_r2(offs_t offset)
uint32_t konamigx_state::type3_sync_r() uint32_t konamigx_state::type3_sync_r()
{ {
if(m_konamigx_current_frame==0) if (m_konamigx_current_frame == 0)
return -1; // return 0xfffffffe | 1; return -1; // return 0xfffffffe | 1;
else else
return 0;// return 0xfffffffe | 0; return 0; // return 0xfffffffe | 0;
} }
@ -900,7 +913,7 @@ void konamigx_state::type4_prot_w(address_space &space, offs_t offset, uint32_t
space.write_word(0xc01400+i, space.read_word(0xc01000+i)); space.write_word(0xc01400+i, space.read_word(0xc01000+i));
} }
} }
else if(m_last_prot_op == 0x57a) // winspike else if (m_last_prot_op == 0x57a) // winspike
{ {
/* player 1 input buffer protection */ /* player 1 input buffer protection */
space.write_dword(0xc10f00, space.read_dword(0xc00f10)); space.write_dword(0xc10f00, space.read_dword(0xc00f10));
@ -912,7 +925,7 @@ void konamigx_state::type4_prot_w(address_space &space, offs_t offset, uint32_t
space.write_dword(0xc0fe00, space.read_dword(0xc00f30)); space.write_dword(0xc0fe00, space.read_dword(0xc00f30));
space.write_dword(0xc0fe04, space.read_dword(0xc00f34)); space.write_dword(0xc0fe04, space.read_dword(0xc00f34));
} }
else if(m_last_prot_op == 0xd97) // rushhero else if (m_last_prot_op == 0xd97) // rushhero
{ {
u32 src = 0xc09ff0; u32 src = 0xc09ff0;
u32 dst = 0xd20000; u32 dst = 0xd20000;
@ -952,7 +965,7 @@ void konamigx_state::type4_prot_w(address_space &space, offs_t offset, uint32_t
space.write_byte(0xc11cc0 + 5, ~space.read_byte(0xc00507 + 0x60)); space.write_byte(0xc11cc0 + 5, ~space.read_byte(0xc00507 + 0x60));
} }
else if(m_last_prot_op == 0xb16) // slamdnk2 else if (m_last_prot_op == 0xb16) // slamdnk2
{ {
int src = 0xc01000; int src = 0xc01000;
int dst = 0xd20000; int dst = 0xd20000;
@ -981,14 +994,14 @@ void konamigx_state::type4_prot_w(address_space &space, offs_t offset, uint32_t
dst += 2; dst += 2;
} }
} }
else if(m_last_prot_op == 0x515) // vsnetscr screen 1 else if (m_last_prot_op == 0x515) // vsnetscr screen 1
{ {
int adr; int adr;
//printf("GXT4: command %x %d (PC=%x)\n", m_last_prot_op, cc++, m_maincpu->pc()); //printf("GXT4: command %x %d (PC=%x)\n", m_last_prot_op, cc++, m_maincpu->pc());
for (adr = 0; adr < 0x400; adr += 2) for (adr = 0; adr < 0x400; adr += 2)
space.write_word(0xc01c00+adr, space.read_word(0xc01800+adr)); space.write_word(0xc01c00+adr, space.read_word(0xc01800+adr));
} }
else if(m_last_prot_op == 0x115d) // vsnetscr screen 2 else if (m_last_prot_op == 0x115d) // vsnetscr screen 2
{ {
int adr; int adr;
//printf("GXT4: command %x %d (PC=%x)\n", m_last_prot_op, cc++, m_maincpu->pc()); //printf("GXT4: command %x %d (PC=%x)\n", m_last_prot_op, cc++, m_maincpu->pc());
@ -2104,7 +2117,7 @@ ROM_START(konamigx)
ROM_END ROM_END
#define SPR_WOR_DROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPWORD | ROM_SKIP(5)) #define SPR_WOR_DROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPWORD | ROM_SKIP(5))
#define SPR_5TH_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPBYTE | ROM_SKIP(5)) #define SPR_5TH_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPBYTE | ROM_SKIP(5))
#define TILE_WORD_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPDWORD | ROM_SKIP(1)) #define TILE_WORD_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPDWORD | ROM_SKIP(1))
#define TILE_BYTE_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPBYTE | ROM_SKIP(4)) #define TILE_BYTE_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPBYTE | ROM_SKIP(4))
@ -2115,7 +2128,7 @@ ROM_END
#define T1_PSAC6_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPBYTE | ROM_SKIP(2)) #define T1_PSAC6_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPBYTE | ROM_SKIP(2))
#define T1_PSAC8_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPBYTE | ROM_SKIP(3)) #define T1_PSAC8_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPBYTE | ROM_SKIP(3))
#define _48_WORD_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPWORD | ROM_SKIP(4)) #define _48_WORD_ROM_LOAD(name,offset,length,crc) ROMX_LOAD(name, offset, length, crc, ROM_GROUPWORD | ROM_SKIP(4))
/* Gokujou Parodius version JAD (Japan) */ /* Gokujou Parodius version JAD (Japan) */

View File

@ -255,7 +255,6 @@ protected:
u8 m_current_brightness = 0xff; u8 m_current_brightness = 0xff;
u8 m_brightness[3]{}; u8 m_brightness[3]{};
u8 m_last_alpha_tile_mix_code = 0; u8 m_last_alpha_tile_mix_code = 0;
// mirrored K054338 settings // mirrored K054338 settings

View File

@ -98,19 +98,19 @@ void konamigx_state::K055550_word_w(offs_t offset, uint16_t data, uint16_t mem_m
// gameplay. It refers to a 32x8-word list at 0x210e00 and seems to // gameplay. It refers to a 32x8-word list at 0x210e00 and seems to
// be tied with another 13x128-byte table at 0x205080. // be tied with another 13x128-byte table at 0x205080.
// Both tables appear "check-only" and have little effect on gameplay. // Both tables appear "check-only" and have little effect on gameplay.
count =(m_prot_data[0] & 0xff) + 1; // unknown ( byte 0x00) count =(m_prot_data[0] & 0xff) + 1; // unknown ( byte 0x00)
i = m_prot_data[1]; // unknown ( byte 0x1f) i = m_prot_data[1]; // unknown ( byte 0x1f)
adr = m_prot_data[7]<<16 | m_prot_data[8]; // address (dword 0x210e00) adr = m_prot_data[7] << 16 | m_prot_data[8]; // address (dword 0x210e00)
lim = m_prot_data[9]; // unknown ( word 0x0010) lim = m_prot_data[9]; // unknown ( word 0x0010)
src = m_prot_data[10]<<16 | m_prot_data[11]; // unknown (dword zero) src = m_prot_data[10] << 16 | m_prot_data[11]; // unknown (dword zero)
tgt = m_prot_data[12]<<16 | m_prot_data[13]; // unknown (dword zero) tgt = m_prot_data[12] << 16 | m_prot_data[13]; // unknown (dword zero)
break; break;
case 0xa0: // update collision detection table (Violent Storm at 0x018b42) case 0xa0: // update collision detection table (Violent Storm at 0x018b42)
count = m_prot_data[0] & 0xff; // number of objects - 1 count = m_prot_data[0] & 0xff; // number of objects - 1
skip = m_prot_data[1]>>(8-1); // words to skip in each entry to reach the "hit list" skip = m_prot_data[1] >> (8 - 1); // words to skip in each entry to reach the "hit list"
adr = m_prot_data[2]<<16 | m_prot_data[3]; // where the table is located adr = m_prot_data[2] << 16 | m_prot_data[3]; // where the table is located
bsize = m_prot_data[5]<<16 | m_prot_data[6]; // object entry size in bytes bsize = m_prot_data[5] << 16 | m_prot_data[6]; // object entry size in bytes
srcend = adr + bsize * count; srcend = adr + bsize * count;
tgtend = srcend + bsize; tgtend = srcend + bsize;
@ -185,7 +185,7 @@ void konamigx_state::K055550_word_w(offs_t offset, uint16_t data, uint16_t mem_m
break; break;
default: default:
// logerror("%06x: unknown K055550 command %02x\n", m_maincpu->pc(), data); //logerror("%06x: unknown K055550 command %02x\n", m_maincpu->pc(), data);
break; break;
} }
} }
@ -204,7 +204,7 @@ void konamigx_state::K053990_martchmp_word_w(offs_t offset, uint16_t data, uint1
if (offset == 0x0c && ACCESSING_BITS_8_15) if (offset == 0x0c && ACCESSING_BITS_8_15)
{ {
mode = (m_prot_data[0x0d]<<8 & 0xff00) | (m_prot_data[0x0f] & 0xff); mode = (m_prot_data[0x0d] << 8 & 0xff00) | (m_prot_data[0x0f] & 0xff);
switch (mode) switch (mode)
{ {
@ -213,11 +213,11 @@ void konamigx_state::K053990_martchmp_word_w(offs_t offset, uint16_t data, uint1
[[fallthrough]]; [[fallthrough]];
case 0xff00: // byte copy case 0xff00: // byte copy
src_addr = m_prot_data[0x0]; src_addr = m_prot_data[0x0];
src_addr |= m_prot_data[0x1]<<16 & 0xff0000; src_addr |= m_prot_data[0x1] << 16 & 0xff0000;
dst_addr = m_prot_data[0x2]; dst_addr = m_prot_data[0x2];
dst_addr |= m_prot_data[0x3]<<16 & 0xff0000; dst_addr |= m_prot_data[0x3] << 16 & 0xff0000;
src_count = m_prot_data[0x8]>>8; src_count = m_prot_data[0x8] >> 8;
//dst_count = m_prot_data[0x9]>>8; //dst_count = m_prot_data[0x9] >> 8;
src_skip = m_prot_data[0xa] & 0xff; src_skip = m_prot_data[0xa] & 0xff;
dst_skip = m_prot_data[0xb] & 0xff; dst_skip = m_prot_data[0xb] & 0xff;
@ -242,14 +242,14 @@ void konamigx_state::K053990_martchmp_word_w(offs_t offset, uint16_t data, uint1
case 0x00ff: // sprite list modifier case 0x00ff: // sprite list modifier
src_addr = m_prot_data[0x0]; src_addr = m_prot_data[0x0];
src_addr |= m_prot_data[0x1]<<16 & 0xff0000; src_addr |= m_prot_data[0x1] << 16 & 0xff0000;
src_skip = m_prot_data[0x1]>>8; src_skip = m_prot_data[0x1] >> 8;
dst_addr = m_prot_data[0x2]; dst_addr = m_prot_data[0x2];
dst_addr |= m_prot_data[0x3]<<16 & 0xff0000; dst_addr |= m_prot_data[0x3] << 16 & 0xff0000;
dst_skip = m_prot_data[0x3]>>8; dst_skip = m_prot_data[0x3] >> 8;
mod_addr = m_prot_data[0x4]; mod_addr = m_prot_data[0x4];
mod_addr |= m_prot_data[0x5]<<16 & 0xff0000; mod_addr |= m_prot_data[0x5] << 16 & 0xff0000;
mod_skip = m_prot_data[0x5]>>8; mod_skip = m_prot_data[0x5] >> 8;
mod_offs = m_prot_data[0x8] & 0xff; mod_offs = m_prot_data[0x8] & 0xff;
mod_offs<<= 1; mod_offs<<= 1;
mod_count = 0x100; mod_count = 0x100;
@ -257,7 +257,7 @@ void konamigx_state::K053990_martchmp_word_w(offs_t offset, uint16_t data, uint1
src_addr += mod_offs; src_addr += mod_offs;
dst_addr += mod_offs; dst_addr += mod_offs;
for (i=mod_count; i; i--) for (i = mod_count; i; i--)
{ {
mod_val = mspace.read_word(mod_addr); mod_val = mspace.read_word(mod_addr);
mod_addr += mod_skip; mod_addr += mod_skip;
@ -287,30 +287,30 @@ void konamigx_state::konamigx_esc_alert(uint32_t *srcbase, int srcoffs, int coun
// hand-filled but should be close // hand-filled but should be close
static const uint8_t ztable[7][8] = static const uint8_t ztable[7][8] =
{ {
{5,4,3,2,1,7,6,0}, { 5, 4, 3, 2, 1, 7, 6, 0 },
{4,3,2,1,0,7,6,5}, { 4, 3, 2, 1, 0, 7, 6, 5 },
{4,3,2,1,0,7,6,5}, { 4, 3, 2, 1, 0, 7, 6, 5 },
{3,2,1,0,5,7,4,6}, { 3, 2, 1, 0, 5, 7, 4, 6 },
{6,5,1,4,3,7,0,2}, { 6, 5, 1, 4, 3, 7, 0, 2 },
{5,4,3,2,1,7,6,0}, { 5, 4, 3, 2, 1, 7, 6, 0 },
{5,4,3,2,1,7,6,0} { 5, 4, 3, 2, 1, 7, 6, 0 }
}; };
static const uint8_t ptable[7][8] = static const uint8_t ptable[7][8] =
{ {
{0x00,0x00,0x00,0x10,0x20,0x00,0x00,0x30}, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x30 },
{0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20}, { 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20 },
{0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00}, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00 },
{0x10,0x10,0x10,0x20,0x00,0x00,0x10,0x00}, { 0x10, 0x10, 0x10, 0x20, 0x00, 0x00, 0x10, 0x00 },
{0x00,0x00,0x20,0x00,0x10,0x00,0x20,0x20}, { 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x20 },
{0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x10}, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10 },
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10} { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 }
}; };
int32_t data1, data2, i, j, vpos, hpos, voffs, hoffs, vcorr, hcorr, vmask, magicid; int32_t data1, data2, i, j, vpos, hpos, voffs, hoffs, vcorr, hcorr, vmask, magicid;
uint32_t *src, *srcend, *obj, *objend; uint32_t *src, *srcend, *obj, *objend;
uint16_t *dst; uint16_t *dst;
const uint8_t *zcode, *pcode; const uint8_t *zcode, *pcode;
if (!count || !srcbase) return; if (!count || !srcbase) return;
@ -318,8 +318,8 @@ static const uint8_t ptable[7][8] =
{ {
src = srcbase + srcoffs; src = srcbase + srcoffs;
dst = k053247_ram; dst = k053247_ram;
data1 = count<<2; data1 = count << 2;
data2 = count<<3; data2 = count << 3;
src += data1; dst += data2; i = -data1; j = -data2; src += data1; dst += data2; i = -data1; j = -data2;
do do
{ {
@ -337,34 +337,35 @@ static const uint8_t ptable[7][8] =
} }
else else
{ {
#define EXTRACT_ODD \
if((data1=obj[0])&0x8000) \ #define EXTRACT_ODD \
{ \ if ((data1 = obj[0]) & 0x8000) \
i = data1 & 7; \ { \
data1 &= 0xff00; \ i = data1 & 7; \
dst[0] = data1 | zcode[i];\ data1 &= 0xff00; \
data1 = obj[1]; \ dst[0] = data1 | zcode[i]; \
dst[1] = data1>>16; \ data1 = obj[1]; \
vpos = data1 & 0xffff; \ dst[1] = data1 >> 16; \
data1 = obj[2]; \ vpos = data1 & 0xffff; \
vpos += voffs; \ data1 = obj[2]; \
dst[4] = data1; \ vpos += voffs; \
vpos &= vmask; \ dst[4] = data1; \
hpos = data1>>16; \ vpos &= vmask; \
data1 = obj[3]; \ hpos = data1>>16; \
hpos += hoffs; \ data1 = obj[3]; \
dst[2] = vpos; \ hpos += hoffs; \
dst[3] = hpos; \ dst[2] = vpos; \
dst[5] = data1>>16; \ dst[3] = hpos; \
i = pcode[i]; \ dst[5] = data1 >> 16; \
dst[6] = data1| i<<4; \ i = pcode[i]; \
dst += 8; \ dst[6] = data1 | i << 4; \
if (!(--j)) return; \ dst += 8; \
if (!(--j)) return; \
} }
#define EXTRACT_EVEN \ #define EXTRACT_EVEN \
if((data1=obj[0])&0x80000000)\ if((data1 = obj[0]) & 0x80000000) \
{ \ { \
dst[1] = data1; \ dst[1] = data1; \
data1>>= 16; \ data1>>= 16; \
i = data1 & 7; \ i = data1 & 7; \
@ -372,7 +373,7 @@ if((data1=obj[0])&0x80000000)\
dst[0] = data1 | zcode[i]; \ dst[0] = data1 | zcode[i]; \
data1 = obj[1]; \ data1 = obj[1]; \
hpos = data1 & 0xffff; \ hpos = data1 & 0xffff; \
vpos = data1>>16; \ vpos = data1 >> 16; \
hpos += hoffs; \ hpos += hoffs; \
vpos += voffs; \ vpos += voffs; \
data1 = obj[2]; \ data1 = obj[2]; \
@ -380,10 +381,10 @@ if((data1=obj[0])&0x80000000)\
dst[3] = hpos; \ dst[3] = hpos; \
dst[2] = vpos; \ dst[2] = vpos; \
dst[5] = data1; \ dst[5] = data1; \
dst[4] = data1>>16; \ dst[4] = data1 >> 16; \
data1 = obj[3]>>16; \ data1 = obj[3] >> 16; \
i = pcode[i]; \ i = pcode[i]; \
dst[6] = data1 | i<<4; \ dst[6] = data1 | i << 4; \
dst += 8; \ dst += 8; \
if (!(--j)) return; \ if (!(--j)) return; \
} }
@ -402,7 +403,7 @@ if((data1=obj[0])&0x80000000)\
case 0x11010010: i = 5; vmask = 0x1ff; break; case 0x11010010: i = 5; vmask = 0x1ff; break;
case 0x01111018: i = 4; break; case 0x01111018: i = 4; break;
case 0x10010011: i = 3; case 0x10010011: i = 3;
if ((srcbase[0x1c75] & 0xff) == 32) m_k055555->K055555_write_reg(K55_BLEND_ENABLES,36); // (TEMPORARY) if ((srcbase[0x1c75] & 0xff) == 32) m_k055555->K055555_write_reg(K55_BLEND_ENABLES, 36); // (TEMPORARY)
break; break;
case 0x11010811: i = 2; break; case 0x11010811: i = 2; break;
case 0x10000010: i = 1; break; case 0x10000010: i = 1; break;
@ -495,23 +496,25 @@ void konamigx_state::fantjour_dma_w(offs_t offset, uint32_t data, uint32_t mem_m
{ {
auto &mspace = m_maincpu->space(AS_PROGRAM); auto &mspace = m_maincpu->space(AS_PROGRAM);
COMBINE_DATA(m_fantjour_dma + offset); COMBINE_DATA(m_fantjour_dma + offset);
if (!offset && ACCESSING_BITS_24_31) { if (!offset && ACCESSING_BITS_24_31)
{
uint32_t sa = m_fantjour_dma[1]; uint32_t sa = m_fantjour_dma[1];
// uint16_t ss = (m_fantjour_dma[2] & 0xffff0000) >> 16; // uint16_t ss = (m_fantjour_dma[2] & 0xffff0000) >> 16;
// uint32_t sb = ((m_fantjour_dma[2] & 0xffff) << 16) | ((m_fantjour_dma[3] & 0xffff0000) >> 16); // uint32_t sb = ((m_fantjour_dma[2] & 0xffff) << 16) | ((m_fantjour_dma[3] & 0xffff0000) >> 16);
uint32_t da = ((m_fantjour_dma[3] & 0xffff) << 16) | ((m_fantjour_dma[4] & 0xffff0000) >> 16); uint32_t da = ((m_fantjour_dma[3] & 0xffff) << 16) | ((m_fantjour_dma[4] & 0xffff0000) >> 16);
// uint16_t ds = m_fantjour_dma[4] & 0xffff; // uint16_t ds = m_fantjour_dma[4] & 0xffff;
uint32_t db = m_fantjour_dma[5]; uint32_t db = m_fantjour_dma[5];
// uint8_t sz1 = m_fantjour_dma[0] >> 8; // uint8_t sz1 = m_fantjour_dma[0] >> 8;
uint8_t sz2 = m_fantjour_dma[0] >> 16; uint8_t sz2 = m_fantjour_dma[0] >> 16;
uint8_t mode = m_fantjour_dma[0] >> 24; uint8_t mode = m_fantjour_dma[0] >> 24;
uint32_t x = m_fantjour_dma[6]; uint32_t x = m_fantjour_dma[6];
uint32_t i1, i2; uint32_t i1, i2;
if (mode == 0x93) if (mode == 0x93)
{
for (i1 = 0; i1 <= sz2; i1++) for (i1 = 0; i1 <= sz2; i1++)
for (i2 = 0; i2 < db; i2 += 4) for (i2 = 0; i2 < db; i2 += 4)
{ {
@ -519,12 +522,15 @@ void konamigx_state::fantjour_dma_w(offs_t offset, uint32_t data, uint32_t mem_m
da += 4; da += 4;
sa += 4; sa += 4;
} }
}
else if (mode == 0x8f) else if (mode == 0x8f)
{
for (i1 = 0; i1 <= sz2; i1++) for (i1 = 0; i1 <= sz2; i1++)
for (i2 = 0; i2 < db; i2 += 4) for (i2 = 0; i2 < db; i2 += 4)
{ {
mspace.write_dword(da, x); mspace.write_dword(da, x);
da += 4; da += 4;
} }
}
} }
} }

View File

@ -20,8 +20,8 @@ static inline void set_color_555(palette_device &palette, pen_t color, int rshif
void konamigx_state::konamigx_precache_registers(void) void konamigx_state::konamigx_precache_registers(void)
{ {
// (see sprite color coding scheme on p.46 & 47) // (see sprite color coding scheme on p.46 & 47)
static const int coregmasks[5] = {0xf,0xe,0xc,0x8,0x0}; static const int coregmasks[5] = { 0xf, 0xe, 0xc, 0x8, 0x0 };
static const int coregshifts[5]= {4,5,6,7,8}; static const int coregshifts[5]= { 4, 5, 6, 7, 8 };
int i; int i;
i = m_k055673->k053247_read_register(0x8/2); i = m_k055673->k053247_read_register(0x8/2);
@ -36,7 +36,7 @@ void konamigx_state::konamigx_precache_registers(void)
i = m_k053247_opset & 7; if (i > 4) i = 4; i = m_k053247_opset & 7; if (i > 4) i = 4;
m_k053247_coreg = m_k055673->k053247_read_register(0xc/2)>>8 & 0xf; m_k053247_coreg = m_k055673->k053247_read_register(0xc/2) >> 8 & 0xf;
m_k053247_coreg =(m_k053247_coreg & coregmasks[i]) << 12; m_k053247_coreg =(m_k053247_coreg & coregmasks[i]) << 12;
m_k053247_coregshift = coregshifts[i]; m_k053247_coregshift = coregshifts[i];
@ -64,10 +64,10 @@ inline int konamigx_state::K053247GX_combine_c18(int attrib) // (see p.46)
{ {
int c18; int c18;
c18 = (attrib & 0xff)<<m_k053247_coregshift | m_k053247_coreg; c18 = (attrib & 0xff) << m_k053247_coregshift | m_k053247_coreg;
if (m_gx_wrport2 & 4) c18 &= 0x3fff; else if (m_gx_wrport2 & 4) c18 &= 0x3fff; else
if (!(m_gx_wrport2 & 8)) c18 = (c18 & 0x3fff) | (attrib<<6 & 0xc000); if (!(m_gx_wrport2 & 8)) c18 = (c18 & 0x3fff) | (attrib << 6 & 0xc000);
return(c18); return(c18);
} }
@ -76,12 +76,12 @@ inline int konamigx_state::K055555GX_decode_objcolor(int c18) // (see p.59 7.2.2
{ {
int ocb, opon; int ocb, opon;
opon = m_oinprion<<8 | 0xff; opon = m_oinprion << 8 | 0xff;
ocb = (m_ocblk & 7) << 10; ocb = (m_ocblk & 7) << 10;
c18 &= opon; c18 &= opon;
ocb &=~opon; ocb &=~opon;
return((ocb | c18) >> m_k053247_coregshift); return (ocb | c18) >> m_k053247_coregshift;
} }
inline int konamigx_state::K055555GX_decode_inpri(int c18) // (see p.59 7.2.2) inline int konamigx_state::K055555GX_decode_inpri(int c18) // (see p.59 7.2.2)
@ -92,7 +92,7 @@ inline int konamigx_state::K055555GX_decode_inpri(int c18) // (see p.59 7.2.2)
op &= m_oinprion; op &= m_oinprion;
c18 &=~m_oinprion; c18 &=~m_oinprion;
return(c18 | op); return c18 | op;
} }
K055673_CB_MEMBER(konamigx_state::type2_sprite_callback) K055673_CB_MEMBER(konamigx_state::type2_sprite_callback)
@ -100,7 +100,7 @@ K055673_CB_MEMBER(konamigx_state::type2_sprite_callback)
int num = *code; int num = *code;
int c18 = *color; int c18 = *color;
*code = m_k053247_vrcbk[num>>14] | (num & 0x3fff); *code = m_k053247_vrcbk[num >> 14] | (num & 0x3fff);
c18 = K053247GX_combine_c18(c18); c18 = K053247GX_combine_c18(c18);
*color = K055555GX_decode_objcolor(c18); *color = K055555GX_decode_objcolor(c18);
*priority_mask = K055555GX_decode_inpri(c18); *priority_mask = K055555GX_decode_inpri(c18);
@ -111,11 +111,11 @@ K055673_CB_MEMBER(konamigx_state::dragoonj_sprite_callback)
int num, op, pri, c18; int num, op, pri, c18;
num = *code; num = *code;
*code = m_k053247_vrcbk[num>>14] | (num & 0x3fff); *code = m_k053247_vrcbk[num >> 14] | (num & 0x3fff);
c18 = pri = *color; c18 = pri = *color;
op = m_opri; op = m_opri;
pri = (pri & 0x200) ? 4 : pri>>4 & 0xf; pri = (pri & 0x200) ? 4 : pri >> 4 & 0xf;
op &= m_oinprion; op &= m_oinprion;
pri &=~m_oinprion; pri &=~m_oinprion;
*priority_mask = pri | op; *priority_mask = pri | op;
@ -129,11 +129,11 @@ K055673_CB_MEMBER(konamigx_state::salmndr2_sprite_callback)
int num, op, pri, c18; int num, op, pri, c18;
num = *code; num = *code;
*code = m_k053247_vrcbk[num>>14] | (num & 0x3fff); *code = m_k053247_vrcbk[num >> 14] | (num & 0x3fff);
c18 = pri = *color; c18 = pri = *color;
op = m_opri; op = m_opri;
pri = pri>>4 & 0x3f; pri = pri >> 4 & 0x3f;
op &= m_oinprion; op &= m_oinprion;
pri &=~m_oinprion; pri &=~m_oinprion;
*priority_mask = pri | op; *priority_mask = pri | op;
@ -147,7 +147,7 @@ K055673_CB_MEMBER(konamigx_state::le2_sprite_callback)
int num, op, pri; int num, op, pri;
num = *code; num = *code;
*code = m_k053247_vrcbk[num>>14] | (num & 0x3fff); *code = m_k053247_vrcbk[num >> 14] | (num & 0x3fff);
pri = *color; pri = *color;
*color &= 0x1f; *color &= 0x1f;
@ -163,12 +163,12 @@ int konamigx_state::K055555GX_decode_vmixcolor(int layer, int *color) // (see p.
{ {
int vcb, shift, pal, vmx, von, pl45, emx; int vcb, shift, pal, vmx, von, pl45, emx;
vcb = m_vcblk[layer]<<6; vcb = m_vcblk[layer] << 6;
shift = layer<<1; shift = layer << 1;
pal = *color; pal = *color;
vmx = m_vinmix>>shift & 3; vmx = m_vinmix >> shift & 3;
von = m_vmixon>>shift & 3; von = m_vmixon >> shift & 3;
emx = pl45 = pal>>4 & 3; emx = pl45 = pal >> 4 & 3;
pal &= 0xf; pal &= 0xf;
pl45 &= von; pl45 &= von;
vmx &= von; vmx &= von;
@ -179,29 +179,29 @@ int konamigx_state::K055555GX_decode_vmixcolor(int layer, int *color) // (see p.
pal |= vcb; pal |= vcb;
//if (m_gx_le2_textcolour_hack) //if (m_gx_le2_textcolour_hack)
// if (layer==0) // if (layer == 0)
// pal |= 0x1c0; // pal |= 0x1c0;
if (von == 3) emx = -1; // invalidate external mix code if all bits are from internal if (von == 3) emx = -1; // invalidate external mix code if all bits are from internal
*color = pal; *color = pal;
return(emx); return emx;
} }
int konamigx_state::K055555GX_decode_osmixcolor(int layer, int *color) // (see p.63, p.49-50 and p.27 3.3) int konamigx_state::K055555GX_decode_osmixcolor(int layer, int *color) // (see p.63, p.49-50 and p.27 3.3)
{ {
int scb, shift, pal, osmx, oson, pl45, emx; int scb, shift, pal, osmx, oson, pl45, emx;
shift = layer<<1; shift = layer << 1;
pal = *color; pal = *color;
osmx = m_osinmix>>shift & 3; osmx = m_osinmix >> shift & 3;
oson = m_osmixon>>shift & 3; oson = m_osmixon >> shift & 3;
if (layer) if (layer)
{ {
// layer 1-3 are external tile layers // layer 1-3 are external tile layers
scb = m_vcblk[layer+3]<<6; scb = m_vcblk[layer + 3] << 6;
emx = pl45 = pal>>4 & 3; emx = pl45 = pal >> 4 & 3;
pal &= 0xf; pal &= 0xf;
pl45 &= oson; pl45 &= oson;
osmx &= oson; osmx &= oson;
@ -217,7 +217,7 @@ int konamigx_state::K055555GX_decode_osmixcolor(int layer, int *color) // (see p
else else
{ {
// layer 0 is the sprite layer with different attributes decode; detail on p.49 (missing) // layer 0 is the sprite layer with different attributes decode; detail on p.49 (missing)
emx = 0; // k053247_read_register(??)>>? & 3; emx = 0; // k053247_read_register(??) >> ? & 3;
osmx &= oson; osmx &= oson;
emx &=~oson; emx &=~oson;
emx |= osmx; emx |= osmx;
@ -243,14 +243,13 @@ void konamigx_state::wipezbuf(int noshadow)
zptr = m_gx_shdzbuf.get(); zptr = m_gx_shdzbuf.get();
w <<= 1; w <<= 1;
ecx = h; ecx = h;
do { memset(zptr, -1, w); zptr += (GX_ZBUFW<<1); } while (--ecx); do { memset(zptr, -1, w); zptr += (GX_ZBUFW << 1); } while (--ecx);
} }
} }
void konamigx_state::set_brightness(int layer) void konamigx_state::set_brightness(int layer)
{ {
const uint8_t bri_mode = (m_k055555->K055555_read_register(K55_VBRI) >> layer * 2) & 0b11; const uint8_t bri_mode = (m_k055555->K055555_read_register(K55_VBRI) >> layer * 2) & 0b11;
const uint8_t new_brightness = bri_mode ? m_brightness[bri_mode - 1] : 0xff; const uint8_t new_brightness = bri_mode ? m_brightness[bri_mode - 1] : 0xff;
if (m_current_brightness != new_brightness) if (m_current_brightness != new_brightness)
@ -314,7 +313,7 @@ void konamigx_state::konamigx_mixer_init(screen_device &screen, int objdma)
else else
m_k055673->k053247_get_ram(&m_gx_spriteram); m_k055673->k053247_get_ram(&m_gx_spriteram);
m_palette->set_shadow_dRGB32(3,-80,-80,-80, 0); m_palette->set_shadow_dRGB32(3, -80, -80, -80, 0);
m_k054338->invert_alpha(1); m_k054338->invert_alpha(1);
} }
@ -336,8 +335,6 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
tilemap_t *sub2, int sub2flags, tilemap_t *sub2, int sub2flags,
int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack) int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack)
{ {
// int prflp;
// buffer can move when it's resized, so refresh the pointer // buffer can move when it's resized, so refresh the pointer
m_gx_objzbuf = &screen.priority().pix(0); m_gx_objzbuf = &screen.priority().pix(0);
@ -355,13 +352,12 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
if (!disp) return; if (!disp) return;
uint16_t cltc_shdpri = m_k054338->register_r(K338_REG_CONTROL); uint16_t cltc_shdpri = m_k054338->register_r(K338_REG_CONTROL);
// Slam Dunk 2 never sets this. It's either part of the protection, or type4 doesn't use it
if (!rushingheroes_hack) // Slam Dunk 2 never sets this. It's either part of the protection, or type4 doesn't use it if (!rushingheroes_hack)
{ {
if (!(cltc_shdpri & K338_CTL_KILL)) return; if (!(cltc_shdpri & K338_CTL_KILL)) return;
} }
// demote shadows by one layer when this bit is set??? (see p.73 8.6) // demote shadows by one layer when this bit is set??? (see p.73 8.6)
cltc_shdpri &= K338_CTL_SHDPRI; cltc_shdpri &= K338_CTL_SHDPRI;
@ -375,11 +371,10 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
konamigx_precache_registers(); konamigx_precache_registers();
// init OBJSET2 and mixer parameters (see p.51 and chapter 7) // init OBJSET2 and mixer parameters (see p.51 and chapter 7)
uint8_t layerid[6] = {0, 1, 2, 3, 4, 5}; uint8_t layerid[6] = { 0, 1, 2, 3, 4, 5 };
// invert layer priority when this flag is set (not used by any GX game?) // invert layer priority when this flag is set (not used by any GX game?)
//prflp = K055555_read_register(K55_CONTROL) & K55_CTL_FLIPPRI; //int prflp = K055555_read_register(K55_CONTROL) & K55_CTL_FLIPPRI;
uint8_t layerpri[6]; uint8_t layerpri[6];
layerpri[0] = m_k055555->K055555_read_register(K55_PRIINP_0); layerpri[0] = m_k055555->K055555_read_register(K55_PRIINP_0);
@ -420,9 +415,8 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
int k = 0; int k = 0;
if (!(mixerflags & GXMIX_NOSHADOW)) if (!(mixerflags & GXMIX_NOSHADOW))
{ {
int i,j;
// only enable shadows beyond a +/-7 RGB threshold // only enable shadows beyond a +/-7 RGB threshold
for (j=0,i=0; i<3; j+=3,i++) for (int j = 0, i = 0; i < 3; j += 3, i++)
{ {
k = m_K054338_shdRGB[j ]; if (k < -7 || k > 7) { shadowon[i] = 1; continue; } k = m_K054338_shdRGB[j ]; if (k < -7 || k > 7) { shadowon[i] = 1; continue; }
k = m_K054338_shdRGB[j+1]; if (k < -7 || k > 7) { shadowon[i] = 1; continue; } k = m_K054338_shdRGB[j+1]; if (k < -7 || k > 7) { shadowon[i] = 1; continue; }
@ -431,16 +425,16 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
// SHDON specifies layers on which shadows can be projected (see detail on p.65 7.2.8) // SHDON specifies layers on which shadows can be projected (see detail on p.65 7.2.8)
int temp = m_k055555->K055555_read_register(K55_SHD_ON); int temp = m_k055555->K055555_read_register(K55_SHD_ON);
for (i=0; i<4; i++) if (!(temp>>i & 1) && spri_min < layerpri[i]) spri_min = layerpri[i]; // HACK for (int i = 0; i < 4; i++) if (!BIT(temp, i) && spri_min < layerpri[i]) spri_min = layerpri[i]; // HACK
// update shadows status // update shadows status
m_k054338->update_all_shadows(rushingheroes_hack, *m_palette); m_k054338->update_all_shadows(rushingheroes_hack, *m_palette);
} }
// pre-sort layers // pre-sort layers
for (int j=0; j<5; j++) for (int j = 0; j < 5; j++)
{ {
for (int i=j+1; i<6; i++) for (int i = j + 1; i < 6; i++)
{ {
if (layerpri[j] <= layerpri[i]) if (layerpri[j] <= layerpri[i])
{ {
@ -453,7 +447,7 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
// build object database and create indices // build object database and create indices
std::vector<GX_OBJ> objpool; // max size: 6 layers + 256 sprites + 256 shadows std::vector<GX_OBJ> objpool; // max size: 6 layers + 256 sprites + 256 shadows
for (int i=5; i>=0; i--) for (int i = 5; i >= 0; i--)
{ {
int offs; int offs;
@ -470,11 +464,11 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
-4 : K053250 LVC layer 1 -4 : K053250 LVC layer 1
-5 : K053250 LVC layer 2 -5 : K053250 LVC layer 2
*/ */
case 4 : case 4:
offs = -128; offs = -128;
if (sub1flags & 0xf) { if (sub1flags & GXSUB_K053250) offs = -4; else if (sub1) offs = -2; } if (sub1flags & 0xf) { if (sub1flags & GXSUB_K053250) offs = -4; else if (sub1) offs = -2; }
break; break;
case 5 : case 5:
offs = -128; offs = -128;
if (sub2flags & 0xf) { if (sub2flags & GXSUB_K053250) offs = -5; else if (sub2) offs = -3; } if (sub2flags & 0xf) { if (sub2flags & GXSUB_K053250) offs = -5; else if (sub2) offs = -3; }
if (extra_bitmap) offs = -3; if (extra_bitmap) offs = -3;
@ -526,7 +520,7 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
} }
else else
{ {
shadow = k>>10 & 3; shadow = k >> 10 & 3;
if (shadow) // object has shadow? if (shadow) // object has shadow?
{ {
int k053246_objset1 = m_k055673->k053246_read_register(5); int k053246_objset1 = m_k055673->k053246_read_register(5);
@ -559,7 +553,7 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
if (add_solid) if (add_solid)
{ {
// tag sprite for alpha blending // tag sprite for alpha blending
if (color>>K055555_MIXSHIFT & 3) solid_draw_mode |= 2; if (color >> K055555_MIXSHIFT & 3) solid_draw_mode |= 2;
} }
if (add_shadow) if (add_shadow)
@ -572,17 +566,17 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
switch (m_gx_primode & 0xf) switch (m_gx_primode & 0xf)
{ {
// Dadandarn zcode suppression // Dadandarn zcode suppression
case 1: case 1:
zcode = 0; zcode = 0;
break; break;
// Daisukiss bad shadow filter // Daisukiss bad shadow filter
case 4: case 4:
if (k & 0x3000 || k == 0x0800) continue; if (k & 0x3000 || k == 0x0800) continue;
[[fallthrough]]; [[fallthrough]];
// Tokkae shadow masking (INACCURATE) // Tokkae shadow masking (INACCURATE)
case 5: case 5:
if (spri < spri_min) spri = spri_min; if (spri < spri_min) spri = spri_min;
break; break;
} }
@ -599,14 +593,14 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
if (add_solid) if (add_solid)
{ {
// add objects with solid or alpha pens // add objects with solid or alpha pens
uint32_t order = pri<<24 | zcode<<16 | offs<<(8-3) | solid_draw_mode<<4; uint32_t order = pri << 24 | zcode << 16 | offs << (8 - 3) | solid_draw_mode << 4;
objpool.push_back(GX_OBJ{order, offs, code, color}); objpool.push_back(GX_OBJ{order, offs, code, color});
} }
if (add_shadow && !(color & K055555_SKIPSHADOW) && !(mixerflags & GXMIX_NOSHADOW)) if (add_shadow && !(color & K055555_SKIPSHADOW) && !(mixerflags & GXMIX_NOSHADOW))
{ {
// add objects with shadows if enabled // add objects with shadows if enabled
uint32_t order = spri<<24 | zcode<<16 | offs<<(8-3) | shadow_draw_mode<<4 | shadow; uint32_t order = spri << 24 | zcode << 16 | offs << (8 - 3) | shadow_draw_mode << 4 | shadow;
objpool.push_back(GX_OBJ{ order, offs, code, color}); objpool.push_back(GX_OBJ{ order, offs, code, color});
} }
} }
@ -618,9 +612,7 @@ void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap,
return a.order > b.order; return a.order > b.order;
}); });
konamigx_mixer_draw(screen,bitmap,cliprect,sub1,sub1flags,sub2,sub2flags,mixerflags,extra_bitmap,rushingheroes_hack, konamigx_mixer_draw(screen, bitmap, cliprect, sub1, sub1flags, sub2, sub2flags, mixerflags, extra_bitmap, rushingheroes_hack, objpool);
objpool
);
} }
void konamigx_state::konamigx_mixer_draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, void konamigx_state::konamigx_mixer_draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect,
@ -635,7 +627,7 @@ void konamigx_state::konamigx_mixer_draw(screen_device &screen, bitmap_rgb32 &bi
// traverse draw list // traverse draw list
const uint8_t disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES); const uint8_t disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES);
for (int count=0; count<objpool.size(); count++) for (int count = 0; count < objpool.size(); count++)
{ {
const uint32_t order = objpool[count].order; const uint32_t order = objpool[count].order;
const int offs = objpool[count].offs; const int offs = objpool[count].offs;
@ -647,7 +639,7 @@ void konamigx_state::konamigx_mixer_draw(screen_device &screen, bitmap_rgb32 &bi
{ {
if (!(disp & K55_INP_OBJ)) continue; if (!(disp & K55_INP_OBJ)) continue;
int drawmode = order>>4 & 0xf; int drawmode = order >> 4 & 0xf;
int alpha = 255; int alpha = 255;
int pri = 0; int pri = 0;
@ -655,7 +647,7 @@ void konamigx_state::konamigx_mixer_draw(screen_device &screen, bitmap_rgb32 &bi
if (drawmode & 2) if (drawmode & 2)
{ {
alpha = color>>K055555_MIXSHIFT & 3; alpha = color >> K055555_MIXSHIFT & 3;
if (alpha) alpha = m_k054338->set_alpha_level(alpha); if (alpha) alpha = m_k054338->set_alpha_level(alpha);
if (alpha <= 0) continue; if (alpha <= 0) continue;
} }
@ -665,15 +657,15 @@ void konamigx_state::konamigx_mixer_draw(screen_device &screen, bitmap_rgb32 &bi
if (!(mixerflags & GXMIX_NOZBUF)) if (!(mixerflags & GXMIX_NOZBUF))
{ {
zcode = order>>16 & 0xff; zcode = order >> 16 & 0xff;
pri = order>>24 & 0xff; pri = order >> 24 & 0xff;
} }
m_k055673->k053247_draw_single_sprite_gxcore(bitmap, cliprect, m_k055673->k053247_draw_single_sprite_gxcore(bitmap, cliprect,
m_gx_objzbuf, m_gx_shdzbuf.get(), code, m_gx_spriteram, offs, m_gx_objzbuf, m_gx_shdzbuf.get(), code, m_gx_spriteram, offs,
color, alpha, drawmode, zcode, pri, color, alpha, drawmode, zcode, pri,
/* non-gx only */ /* non-gx only */
0,0,nullptr,nullptr,0 0, 0, nullptr, nullptr, 0
); );
} }
/* the rest are tilemaps of various kinda */ /* the rest are tilemaps of various kinda */
@ -766,9 +758,9 @@ void konamigx_state::gx_draw_basic_tilemaps(screen_device &screen, bitmap_rgb32
void konamigx_state::gx_draw_basic_extended_tilemaps_1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int mixerflags, int code, tilemap_t *sub1, int sub1flags, int rushingheroes_hack, int offs) void konamigx_state::gx_draw_basic_extended_tilemaps_1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int mixerflags, int code, tilemap_t *sub1, int sub1flags, int rushingheroes_hack, int offs)
{ {
int temp1,temp2,temp3,temp4; int temp1, temp2, temp3, temp4;
int i = code<<1; int i = code << 1;
int j = mixerflags>>i & 3; int j = mixerflags >> i & 3;
int k = 0; int k = 0;
int disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES); int disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES);
@ -777,15 +769,15 @@ void konamigx_state::gx_draw_basic_extended_tilemaps_1(screen_device &screen, bi
int alpha = 255; int alpha = 255;
if (j == GXMIX_BLEND_NONE) { temp1 = 0xff; temp2 = temp3 = 0; } else if (j == GXMIX_BLEND_NONE) { temp1 = 0xff; temp2 = temp3 = 0; } else
if (j == GXMIX_BLEND_FORCE) { temp1 = 0x00; temp2 = mixerflags>>24; temp3 = 3; } if (j == GXMIX_BLEND_FORCE) { temp1 = 0x00; temp2 = mixerflags >> 24; temp3 = 3; }
else else
{ {
temp1 = m_osinmix; temp1 = m_osinmix;
temp2 = m_osinmix>>2 & 3; temp2 = m_osinmix >> 2 & 3;
temp3 = m_osmixon>>2 & 3; temp3 = m_osmixon >> 2 & 3;
} }
if (temp1!=0xff && temp2 /*&& temp3==3*/) if (temp1 != 0xff && temp2 /*&& temp3 == 3*/)
{ {
alpha = temp4 = m_k054338->set_alpha_level(temp2) & 0xff; alpha = temp4 = m_k054338->set_alpha_level(temp2) & 0xff;
@ -801,14 +793,14 @@ void konamigx_state::gx_draw_basic_extended_tilemaps_1(screen_device &screen, bi
const rectangle &visarea = screen.visible_area(); const rectangle &visarea = screen.visible_area();
int width = visarea.width(); int width = visarea.width();
if (width>512) // vsnetscr case if (width > 512) // vsnetscr case
pixeldouble_output = 1; pixeldouble_output = 1;
K053936GP_0_zoom_draw(machine(), bitmap, cliprect, sub1, l, k, alpha, pixeldouble_output, m_k053936_0_ctrl_16, m_k053936_0_linectrl_16, m_k053936_0_ctrl, m_k053936_0_linectrl, *m_palette); K053936GP_0_zoom_draw(machine(), bitmap, cliprect, sub1, l, k, alpha, pixeldouble_output, m_k053936_0_ctrl_16, m_k053936_0_linectrl_16, m_k053936_0_ctrl, m_k053936_0_linectrl, *m_palette);
} }
else else
{ {
m_k053250_1->draw(bitmap, cliprect, m_vcblk[4]<<l, 0, screen.priority(), 0); m_k053250_1->draw(bitmap, cliprect, m_vcblk[4] << l, 0, screen.priority(), 0);
} }
} }
} }
@ -816,23 +808,23 @@ void konamigx_state::gx_draw_basic_extended_tilemaps_1(screen_device &screen, bi
void konamigx_state::gx_draw_basic_extended_tilemaps_2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int mixerflags, int code, tilemap_t *sub2, int sub2flags, bitmap_ind16 *extra_bitmap, int offs) void konamigx_state::gx_draw_basic_extended_tilemaps_2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int mixerflags, int code, tilemap_t *sub2, int sub2flags, bitmap_ind16 *extra_bitmap, int offs)
{ {
int temp1,temp2,temp3,temp4; int temp1,temp2,temp3,temp4;
int i = code<<1; int i = code << 1;
int j = mixerflags>>i & 3; int j = mixerflags >> i & 3;
int disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES); int disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES);
if (disp & K55_INP_SUB2) if (disp & K55_INP_SUB2)
{ {
//int alpha = 255; //int alpha = 255;
if (j == GXMIX_BLEND_NONE) { temp1 = 0xff; temp2 = temp3 = 0; } else if (j == GXMIX_BLEND_NONE) { temp1 = 0xff; temp2 = temp3 = 0; } else
if (j == GXMIX_BLEND_FORCE) { temp1 = 0x00; temp2 = mixerflags>>26; temp3 = 3; } if (j == GXMIX_BLEND_FORCE) { temp1 = 0x00; temp2 = mixerflags >> 26; temp3 = 3; }
else else
{ {
temp1 = m_osinmix; temp1 = m_osinmix;
temp2 = m_osinmix>>4 & 3; temp2 = m_osinmix >> 4 & 3;
temp3 = m_osmixon>>4 & 3; temp3 = m_osmixon >> 4 & 3;
} }
if (temp1!=0xff && temp2 /*&& temp3==3*/) if (temp1 != 0xff && temp2 /*&& temp3==3*/)
{ {
//alpha = //alpha =
temp4 = m_k054338->set_alpha_level(temp2) & 0xff; temp4 = m_k054338->set_alpha_level(temp2) & 0xff;
@ -856,27 +848,27 @@ void konamigx_state::gx_draw_basic_extended_tilemaps_2(screen_device &screen, bi
// to be done as a post-processing / mixing step effect // to be done as a post-processing / mixing step effect
// //
// - todo, use the pixeldouble_output I just added for vsnet instead? // - todo, use the pixeldouble_output I just added for vsnet instead?
for (int yy=0;yy<height;yy++) for (int yy = 0; yy < height; yy++)
{ {
uint16_t const *const src = &extra_bitmap->pix(yy); uint16_t const *const src = &extra_bitmap->pix(yy);
uint32_t *const dst = &bitmap.pix(yy); uint32_t *const dst = &bitmap.pix(yy);
int shiftpos = 0; int shiftpos = 0;
for (int xx=0;xx<width;xx+=2) for (int xx = 0; xx < width; xx += 2)
{ {
uint16_t dat = src[(((xx/2)+shiftpos))%width]; uint16_t dat = src[(((xx / 2) + shiftpos)) % width];
if (dat&0xff) if (dat & 0xff)
dst[xx+1] = dst[xx] = paldata[dat]; dst[xx + 1] = dst[xx] = paldata[dat];
} }
} }
} }
else else
{ {
// int pixeldouble_output = 0; // int pixeldouble_output = 0;
// K053936GP_1_zoom_draw(machine, bitmap, cliprect, sub2, l, k, alpha, pixeldouble_output); // K053936GP_1_zoom_draw(machine, bitmap, cliprect, sub2, l, k, alpha, pixeldouble_output);
} }
} }
else else
m_k053250_2->draw(bitmap, cliprect, m_vcblk[5]<<l, 0, screen.priority(), 0); m_k053250_2->draw(bitmap, cliprect, m_vcblk[5] << l, 0, screen.priority(), 0);
} }
} }
@ -884,18 +876,18 @@ void konamigx_state::gx_draw_basic_extended_tilemaps_2(screen_device &screen, bi
TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac_tile_info) TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac_tile_info)
{ {
int tileno, colour, col, flip = 0; int tileno, colour, col, flip = 0;
if (tile_index&1) if (tile_index & 1)
{ {
tileno = m_psacram[tile_index/2] & 0x00001fff; tileno = m_psacram[tile_index/2] & 0x00001fff;
col =(m_psacram[tile_index/2] & 0x00002000)>>13; col =(m_psacram[tile_index/2] & 0x00002000) >> 13;
if (m_psacram[tile_index/2] & 0x00004000) flip |= TILE_FLIPX; if (m_psacram[tile_index/2] & 0x00004000) flip |= TILE_FLIPX;
if (m_psacram[tile_index/2] & 0x00008000) flip |= TILE_FLIPY; if (m_psacram[tile_index/2] & 0x00008000) flip |= TILE_FLIPY;
} }
else else
{ {
tileno = (m_psacram[tile_index/2] & 0x1fff0000)>>16; tileno = (m_psacram[tile_index/2] & 0x1fff0000) >> 16;
col = (m_psacram[tile_index/2] & 0x20000000)>>29; col = (m_psacram[tile_index/2] & 0x20000000) >> 29;
if (m_psacram[tile_index/2] & 0x40000000) flip |= TILE_FLIPX; if (m_psacram[tile_index/2] & 0x40000000) flip |= TILE_FLIPX;
if (m_psacram[tile_index/2] & 0x80000000) flip |= TILE_FLIPY; if (m_psacram[tile_index/2] & 0x80000000) flip |= TILE_FLIPY;
@ -945,13 +937,12 @@ TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac3_tile_info)
// if (m_konamigx_type3_psac2_actual_bank) // if (m_konamigx_type3_psac2_actual_bank)
// base_index+=0x20000/2; // base_index+=0x20000/2;
tileno = tmap[base_index*2] | ((tmap[(base_index*2) + 1] & 0x0f) << 8);
tileno = tmap[base_index*2] | ((tmap[(base_index*2)+1] & 0x0f)<<8); colour = (tmap[(base_index*2) + 1] & 0xc0) >> 6;
colour = (tmap[(base_index*2)+1]&0xc0)>>6;
flip = 0; flip = 0;
if (tmap[(base_index*2)+1] & 0x20) flip |= TILE_FLIPY; if (tmap[(base_index*2) + 1] & 0x20) flip |= TILE_FLIPY;
if (tmap[(base_index*2)+1] & 0x10) flip |= TILE_FLIPX; if (tmap[(base_index*2) + 1] & 0x10) flip |= TILE_FLIPX;
tileinfo.set(0, tileno, colour, flip); tileinfo.set(0, tileno, colour, flip);
} }
@ -959,16 +950,15 @@ TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac3_tile_info)
TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac3_alt_tile_info) TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac3_alt_tile_info)
{ {
int tileno, colour, flip; int tileno, colour, flip;
uint8_t *tmap = memregion("gfx4")->base()+0x20000; uint8_t *tmap = memregion("gfx4")->base() + 0x20000;
int base_index = tile_index; int base_index = tile_index;
// if (m_konamigx_type3_psac2_actual_bank) // if (m_konamigx_type3_psac2_actual_bank)
// base_index+=0x20000/2; // base_index+=0x20000/2;
tileno = tmap[base_index*2] | ((tmap[(base_index*2) + 1] & 0x0f) << 8);
tileno = tmap[base_index*2] | ((tmap[(base_index*2)+1] & 0x0f)<<8); colour = (tmap[(base_index*2) + 1] & 0xc0) >> 6;
colour = (tmap[(base_index*2)+1]&0xc0)>>6;
flip = 0; flip = 0;
if (tmap[(base_index*2)+1] & 0x20) flip |= TILE_FLIPY; if (tmap[(base_index*2)+1] & 0x20) flip |= TILE_FLIPY;
@ -996,18 +986,18 @@ TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac3_alt_tile_info)
doesn't really look like it should be displayed? - it's height data */ doesn't really look like it should be displayed? - it's height data */
TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac1a_tile_info) TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac1a_tile_info)
{ {
int tileno, colour, flipx,flipy; int tileno, colour, flipx, flipy;
int flip = 0; int flip = 0;
colour = 0; colour = 0;
tileno = (m_psacram[tile_index*2] & 0x00003fff)>>0; tileno = (m_psacram[tile_index*2] & 0x00003fff) >> 0;
// scanrows // scanrows
//flipx = (m_psacram[tile_index*2+1] & 0x00800000)>>23; //flipx = (m_psacram[tile_index*2+1] & 0x00800000) >> 23;
//flipy = (m_psacram[tile_index*2+1] & 0x00400000)>>22; //flipy = (m_psacram[tile_index*2+1] & 0x00400000) >> 22;
// scancols // scancols
flipy = (m_psacram[tile_index*2+1] & 0x00800000)>>23; flipy = (m_psacram[tile_index*2+1] & 0x00800000) >> 23;
flipx = (m_psacram[tile_index*2+1] & 0x00400000)>>22; flipx = (m_psacram[tile_index*2+1] & 0x00400000) >> 22;
if (flipx) flip |= TILE_FLIPX; if (flipx) flip |= TILE_FLIPX;
if (flipy) flip |= TILE_FLIPY; if (flipy) flip |= TILE_FLIPY;
@ -1043,34 +1033,36 @@ K056832_CB_MEMBER(konamigx_state::type2_tile_callback)
{ {
int d = *code; int d = *code;
*code = (m_gx_tilebanks[(d & 0xe000)>>13]<<13) + (d & 0x1fff); *code = (m_gx_tilebanks[(d & 0xe000) >> 13] << 13) + (d & 0x1fff);
K055555GX_decode_vmixcolor(layer, color); K055555GX_decode_vmixcolor(layer, color);
} }
K056832_CB_MEMBER(konamigx_state::salmndr2_tile_callback) K056832_CB_MEMBER(konamigx_state::salmndr2_tile_callback)
{ {
const uint8_t mix_code = attr >> 4 & 0b11; const uint8_t mix_code = attr >> 4 & 0b11;
if (mix_code) { if (mix_code)
{
*priority = 1; *priority = 1;
m_last_alpha_tile_mix_code = mix_code; m_last_alpha_tile_mix_code = mix_code;
} }
int d = *code; int d = *code;
*code = (m_gx_tilebanks[(d & 0xe000)>>13]<<13) + (d & 0x1fff); *code = (m_gx_tilebanks[(d & 0xe000) >> 13] << 13) + (d & 0x1fff);
K055555GX_decode_vmixcolor(layer, color); K055555GX_decode_vmixcolor(layer, color);
} }
K056832_CB_MEMBER(konamigx_state::alpha_tile_callback) K056832_CB_MEMBER(konamigx_state::alpha_tile_callback)
{ {
const uint8_t mix_code = attr >> 6 & 0b11; const uint8_t mix_code = attr >> 6 & 0b11;
if (mix_code) { if (mix_code)
{
*priority = 1; *priority = 1;
m_last_alpha_tile_mix_code = mix_code; m_last_alpha_tile_mix_code = mix_code;
} }
int d = *code; int d = *code;
*code = (m_gx_tilebanks[(d & 0xe000)>>13]<<13) + (d & 0x1fff); *code = (m_gx_tilebanks[(d & 0xe000) >> 13] << 13) + (d & 0x1fff);
K055555GX_decode_vmixcolor(layer, color); K055555GX_decode_vmixcolor(layer, color);
} }
@ -1129,6 +1121,7 @@ void konamigx_state::common_init()
save_item(NAME(m_osmixon)); save_item(NAME(m_osmixon));
save_item(NAME(m_current_brightness)); save_item(NAME(m_current_brightness));
save_item(NAME(m_brightness)); save_item(NAME(m_brightness));
save_item(NAME(m_last_alpha_tile_mix_code));
m_gx_tilemode = 0; m_gx_tilemode = 0;
@ -1155,11 +1148,11 @@ VIDEO_START_MEMBER(konamigx_state, konamigx_5bpp)
{ {
common_init(); common_init();
if (!strcmp(machine().system().name,"tbyahhoo")) if (!strcmp(machine().system().name, "tbyahhoo") || !strcmp(machine().system().name, "mtwinbee"))
m_gx_tilemode = 1; m_gx_tilemode = 1;
else if (!strcmp(machine().system().name,"crzcross") || !strcmp(machine().system().name,"puzldama")) else if (!strcmp(machine().system().name, "crzcross") || !strcmp(machine().system().name, "puzldama"))
konamigx_mixer_primode(5); konamigx_mixer_primode(5);
else if (!strcmp(machine().system().name,"daiskiss")) else if (!strcmp(machine().system().name, "daiskiss"))
konamigx_mixer_primode(4); konamigx_mixer_primode(4);
} }
@ -1191,32 +1184,30 @@ VIDEO_START_MEMBER(konamigx_state, konamigx_type3)
int width = m_screen->width(); int width = m_screen->width();
int height = m_screen->height(); int height = m_screen->height();
m_dualscreen_left_tempbitmap = std::make_unique<bitmap_rgb32>( width, height); m_dualscreen_left_tempbitmap = std::make_unique<bitmap_rgb32>(width, height);
m_dualscreen_right_tempbitmap = std::make_unique<bitmap_rgb32>( width, height); m_dualscreen_right_tempbitmap = std::make_unique<bitmap_rgb32>(width, height);
common_init(); common_init();
m_gx_psac_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac3_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 256, 256); m_gx_psac_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac3_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 256, 256);
m_gx_psac_tilemap_alt = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac3_alt_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 256, 256); m_gx_psac_tilemap_alt = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac3_alt_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 256, 256);
m_gx_rozenable = 0; m_gx_rozenable = 0;
m_gx_specialrozenable = 2; m_gx_specialrozenable = 2;
/* set up tile layers */ /* set up tile layers */
m_type3_roz_temp_bitmap = std::make_unique<bitmap_ind16>(width, height); m_type3_roz_temp_bitmap = std::make_unique<bitmap_ind16>(width, height);
//m_gx_psac_tilemap->set_flip(TILEMAP_FLIPX| TILEMAP_FLIPY); //m_gx_psac_tilemap->set_flip(TILEMAP_FLIPX| TILEMAP_FLIPY);
K053936_wraparound_enable(0, 1); K053936_wraparound_enable(0, 1);
// K053936GP_set_offset(0, -30, -1); // K053936GP_set_offset(0, -30, -1);
K053936_set_offset(0, -30, +1); K053936_set_offset(0, -30, +1);
m_k056832->set_layer_offs(0, -52, 0); m_k056832->set_layer_offs(0, -52, 0);
m_k056832->set_layer_offs(1, -48, 0); m_k056832->set_layer_offs(1, -48, 0);
m_k056832->set_layer_offs(2, -48, 0); m_k056832->set_layer_offs(2, -48, 0);
m_k056832->set_layer_offs(3, -48, 0); m_k056832->set_layer_offs(3, -48, 0);
m_konamigx_has_dual_screen = 1; m_konamigx_has_dual_screen = 1;
m_konamigx_palformat = 1; m_konamigx_palformat = 1;
@ -1227,19 +1218,19 @@ VIDEO_START_MEMBER(konamigx_state, konamigx_type4)
int width = m_screen->width(); int width = m_screen->width();
int height = m_screen->height(); int height = m_screen->height();
m_dualscreen_left_tempbitmap = std::make_unique<bitmap_rgb32>( width, height); m_dualscreen_left_tempbitmap = std::make_unique<bitmap_rgb32>(width, height);
m_dualscreen_right_tempbitmap = std::make_unique<bitmap_rgb32>( width, height); m_dualscreen_right_tempbitmap = std::make_unique<bitmap_rgb32>(width, height);
common_init(); common_init();
m_gx_psac_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 128, 128); m_gx_psac_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 128, 128);
m_gx_rozenable = 0; m_gx_rozenable = 0;
m_gx_specialrozenable = 3; m_gx_specialrozenable = 3;
m_k056832->set_layer_offs(0, -27, 0); m_k056832->set_layer_offs(0, -27, 0);
m_k056832->set_layer_offs(1, -25, 0); m_k056832->set_layer_offs(1, -25, 0);
m_k056832->set_layer_offs(2, -24, 0); m_k056832->set_layer_offs(2, -24, 0);
m_k056832->set_layer_offs(3, -22, 0); m_k056832->set_layer_offs(3, -22, 0);
K053936_wraparound_enable(0, 0); K053936_wraparound_enable(0, 0);
K053936GP_set_offset(0, -36, 1); K053936GP_set_offset(0, -36, 1);
@ -1260,14 +1251,14 @@ VIDEO_START_MEMBER(konamigx_state, konamigx_type4_vsn)
common_init(); common_init();
m_gx_psac_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 128, 128); m_gx_psac_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 128, 128);
m_gx_rozenable = 0; m_gx_rozenable = 0;
m_gx_specialrozenable = 3; m_gx_specialrozenable = 3;
m_k056832->set_layer_offs(0, -52, 0); m_k056832->set_layer_offs(0, -52, 0);
m_k056832->set_layer_offs(1, -48, 0); m_k056832->set_layer_offs(1, -48, 0);
m_k056832->set_layer_offs(2, -48, 0); m_k056832->set_layer_offs(2, -48, 0);
m_k056832->set_layer_offs(3, -48, 0); m_k056832->set_layer_offs(3, -48, 0);
K053936_wraparound_enable(0, 1); // wraparound doesn't work properly with the custom drawing function anyway, see the crowd in vsnet and rushhero K053936_wraparound_enable(0, 1); // wraparound doesn't work properly with the custom drawing function anyway, see the crowd in vsnet and rushhero
K053936GP_set_offset(0, -30, 0); K053936GP_set_offset(0, -30, 0);
@ -1287,16 +1278,14 @@ VIDEO_START_MEMBER(konamigx_state, konamigx_type4_sd2)
common_init(); common_init();
m_gx_psac_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 128, 128); m_gx_psac_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(konamigx_state::get_gx_psac_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 128, 128);
m_gx_rozenable = 0; m_gx_rozenable = 0;
m_gx_specialrozenable = 3; m_gx_specialrozenable = 3;
m_k056832->set_layer_offs(0, -29, -1);
m_k056832->set_layer_offs(0, -29, -1); m_k056832->set_layer_offs(1, -27, -1);
m_k056832->set_layer_offs(1, -27, -1); m_k056832->set_layer_offs(2, -26, -1);
m_k056832->set_layer_offs(2, -26, -1); m_k056832->set_layer_offs(3, -24, -1);
m_k056832->set_layer_offs(3, -24, -1);
K053936_wraparound_enable(0, 0); K053936_wraparound_enable(0, 0);
K053936GP_set_offset(0, -36, -1); K053936GP_set_offset(0, -36, -1);
@ -1326,19 +1315,17 @@ VIDEO_START_MEMBER(konamigx_state, opengolf)
m_gx_rozenable = 0; m_gx_rozenable = 0;
m_gx_specialrozenable = 1; m_gx_specialrozenable = 1;
m_gxtype1_roz_dstbitmap = std::make_unique<bitmap_ind16>(512,512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing m_gxtype1_roz_dstbitmap = std::make_unique<bitmap_ind16>(512, 512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing
m_gxtype1_roz_dstbitmap2 = std::make_unique<bitmap_ind16>(512,512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing m_gxtype1_roz_dstbitmap2 = std::make_unique<bitmap_ind16>(512, 512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing
m_gxtype1_roz_dstbitmapclip.set(0, 512-1, 0, 512-1); m_gxtype1_roz_dstbitmapclip.set(0, 512-1, 0, 512-1);
K053936_wraparound_enable(0, 1); K053936_wraparound_enable(0, 1);
K053936GP_set_offset(0, 0, 0); K053936GP_set_offset(0, 0, 0);
// urgh.. the priority bitmap is global, and because our temp bitmaps are bigger than the screen, this causes issues.. so just allocate something huge // urgh.. the priority bitmap is global, and because our temp bitmaps are bigger than the screen, this causes issues.. so just allocate something huge
// until there is a better solution, or priority bitmap can be specified manually. // until there is a better solution, or priority bitmap can be specified manually.
m_screen->priority().allocate(2048,2048); m_screen->priority().allocate(2048, 2048);
} }
@ -1361,19 +1348,17 @@ VIDEO_START_MEMBER(konamigx_state, racinfrc)
m_gx_rozenable = 0; m_gx_rozenable = 0;
m_gx_specialrozenable = 1; m_gx_specialrozenable = 1;
m_gxtype1_roz_dstbitmap = std::make_unique<bitmap_ind16>(512,512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing m_gxtype1_roz_dstbitmap = std::make_unique<bitmap_ind16>(512, 512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing
m_gxtype1_roz_dstbitmap2 = std::make_unique<bitmap_ind16>(512,512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing m_gxtype1_roz_dstbitmap2 = std::make_unique<bitmap_ind16>(512, 512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing
m_gxtype1_roz_dstbitmapclip.set(0, 512-1, 0, 512-1); m_gxtype1_roz_dstbitmapclip.set(0, 512-1, 0, 512-1);
K053936_wraparound_enable(0, 1); K053936_wraparound_enable(0, 1);
K053936GP_set_offset(0, 0, 0); K053936GP_set_offset(0, 0, 0);
// urgh.. the priority bitmap is global, and because our temp bitmaps are bigger than the screen, this causes issues.. so just allocate something huge // urgh.. the priority bitmap is global, and because our temp bitmaps are bigger than the screen, this causes issues.. so just allocate something huge
// until there is a better solution, or priority bitmap can be specified manually. // until there is a better solution, or priority bitmap can be specified manually.
m_screen->priority().allocate(2048,2048); m_screen->priority().allocate(2048, 2048);
} }
@ -1393,9 +1378,9 @@ uint32_t konamigx_state::screen_update_konamigx(screen_device &screen, bitmap_rg
{ {
// driver approximates tile update in mode 0 for speed // driver approximates tile update in mode 0 for speed
unchained = m_k056832->get_layer_association(); unchained = m_k056832->get_layer_association();
for (i=0; i<4; i++) for (i = 0; i < 4; i++)
{ {
newbase = m_k055555->K055555_get_palette_index(i)<<6; newbase = m_k055555->K055555_get_palette_index(i) << 6;
if (m_layer_colorbase[i] != newbase) if (m_layer_colorbase[i] != newbase)
{ {
m_layer_colorbase[i] = newbase; m_layer_colorbase[i] = newbase;
@ -1433,13 +1418,11 @@ uint32_t konamigx_state::screen_update_konamigx(screen_device &screen, bitmap_rg
// Type-1 // Type-1
if (m_gx_specialrozenable == 1) if (m_gx_specialrozenable == 1)
{ {
//K053936_0_zoom_draw(screen, *m_gxtype1_roz_dstbitmap, m_gxtype1_roz_dstbitmapclip,m_gx_psac_tilemap, 0,0,0); // height data //K053936_0_zoom_draw(screen, *m_gxtype1_roz_dstbitmap, m_gxtype1_roz_dstbitmapclip,m_gx_psac_tilemap, 0, 0, 0); // height data
K053936_0_zoom_draw(screen, *m_gxtype1_roz_dstbitmap2,m_gxtype1_roz_dstbitmapclip,m_gx_psac_tilemap2,0,0,0); // colour data (+ some voxel height data?) K053936_0_zoom_draw(screen, *m_gxtype1_roz_dstbitmap2,m_gxtype1_roz_dstbitmapclip,m_gx_psac_tilemap2, 0, 0, 0); // colour data (+ some voxel height data?)
} }
if (m_gx_specialrozenable == 3)
if (m_gx_specialrozenable==3)
{ {
konamigx_mixer(screen, bitmap, cliprect, m_gx_psac_tilemap, GXSUB_8BPP,nullptr,0, 0, nullptr, m_gx_rushingheroes_hack); konamigx_mixer(screen, bitmap, cliprect, m_gx_psac_tilemap, GXSUB_8BPP,nullptr,0, 0, nullptr, m_gx_rushingheroes_hack);
} }
@ -1449,10 +1432,10 @@ uint32_t konamigx_state::screen_update_konamigx(screen_device &screen, bitmap_rg
// we're going to throw half of this away anyway in post-process, so only render what's needed // we're going to throw half of this away anyway in post-process, so only render what's needed
rectangle temprect; rectangle temprect;
temprect = cliprect; temprect = cliprect;
temprect.max_x = cliprect.min_x+320; temprect.max_x = cliprect.min_x + 320;
if (m_type3_psac2_bank == 1) K053936_0_zoom_draw(screen, *m_type3_roz_temp_bitmap, temprect,m_gx_psac_tilemap_alt, 0,0,0); // soccerss playfield if (m_type3_psac2_bank == 1) K053936_0_zoom_draw(screen, *m_type3_roz_temp_bitmap, temprect,m_gx_psac_tilemap_alt, 0, 0, 0); // soccerss playfield
else K053936_0_zoom_draw(screen, *m_type3_roz_temp_bitmap, temprect,m_gx_psac_tilemap, 0,0,0); // soccerss playfield else K053936_0_zoom_draw(screen, *m_type3_roz_temp_bitmap, temprect,m_gx_psac_tilemap, 0, 0, 0); // soccerss playfield
konamigx_mixer(screen, bitmap, cliprect, nullptr, 0, nullptr, 0, 0, m_type3_roz_temp_bitmap.get(), m_gx_rushingheroes_hack); konamigx_mixer(screen, bitmap, cliprect, nullptr, 0, nullptr, 0, 0, m_type3_roz_temp_bitmap.get(), m_gx_rushingheroes_hack);
@ -1482,9 +1465,9 @@ uint32_t konamigx_state::screen_update_konamigx(screen_device &screen, bitmap_rg
uint16_t const *const src = &m_gxtype1_roz_dstbitmap2->pix(y); uint16_t const *const src = &m_gxtype1_roz_dstbitmap2->pix(y);
//uint16_t const *const src = &m_gxtype1_roz_dstbitmap->pix(y); //uint16_t const *const src = &m_gxtype1_roz_dstbitmap->pix(y);
uint32_t *const dst = &bitmap.pix((256+16)-y); uint32_t *const dst = &bitmap.pix((256 + 16) - y);
for (int x = cliprect.min_x; x <= cliprect.max_x;x++) for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{ {
uint16_t const dat = src[x]; uint16_t const dat = src[x];
dst[x] = paldata[dat]; dst[x] = paldata[dat];
@ -1502,15 +1485,15 @@ uint32_t konamigx_state::screen_update_konamigx(screen_device &screen, bitmap_rg
uint32_t konamigx_state::screen_update_konamigx_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) uint32_t konamigx_state::screen_update_konamigx_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
/* the video gets demuxed by a board which plugs into the jamma connector */ /* the video gets demuxed by a board which plugs into the jamma connector */
m_konamigx_current_frame^=1; m_konamigx_current_frame ^= 1;
if (m_konamigx_current_frame==1) if (m_konamigx_current_frame == 1)
{ {
int offset=0; int offset=0;
if (m_konamigx_palformat==1) if (m_konamigx_palformat == 1)
{ {
for (offset=0;offset<0x4000/4;offset++) for (offset = 0; offset < 0x4000/4; offset++)
{ {
uint32_t coldat = m_generic_paletteram_32[offset]; uint32_t coldat = m_generic_paletteram_32[offset];
@ -1520,13 +1503,11 @@ uint32_t konamigx_state::screen_update_konamigx_left(screen_device &screen, bitm
} }
else else
{ {
for (offset=0;offset<0x8000/4;offset++) for (offset = 0; offset < 0x8000/4; offset++)
{ {
int r,g,b; int r = (m_generic_paletteram_32[offset] >>16) & 0xff;
int g = (m_generic_paletteram_32[offset] >> 8) & 0xff;
r = (m_generic_paletteram_32[offset] >>16) & 0xff; int b = (m_generic_paletteram_32[offset] >> 0) & 0xff;
g = (m_generic_paletteram_32[offset] >> 8) & 0xff;
b = (m_generic_paletteram_32[offset] >> 0) & 0xff;
m_palette->set_pen_color(offset,rgb_t(r,g,b)); m_palette->set_pen_color(offset,rgb_t(r,g,b));
} }
@ -1545,7 +1526,7 @@ uint32_t konamigx_state::screen_update_konamigx_left(screen_device &screen, bitm
uint32_t konamigx_state::screen_update_konamigx_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) uint32_t konamigx_state::screen_update_konamigx_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
if (m_konamigx_current_frame==1) if (m_konamigx_current_frame == 1)
{ {
copybitmap(bitmap, *m_dualscreen_right_tempbitmap, 0, 0, 0, 0, cliprect); copybitmap(bitmap, *m_dualscreen_right_tempbitmap, 0, 0, 0, 0, cliprect);
} }
@ -1553,9 +1534,9 @@ uint32_t konamigx_state::screen_update_konamigx_right(screen_device &screen, bit
{ {
int offset=0; int offset=0;
if (m_konamigx_palformat==1) if (m_konamigx_palformat == 1)
{ {
for (offset=0;offset<0x4000/4;offset++) for (offset = 0; offset < 0x4000/4; offset++)
{ {
uint32_t coldat = m_subpaletteram32[offset]; uint32_t coldat = m_subpaletteram32[offset];
@ -1565,13 +1546,11 @@ uint32_t konamigx_state::screen_update_konamigx_right(screen_device &screen, bit
} }
else else
{ {
for (offset=0;offset<0x8000/4;offset++) for (offset = 0; offset < 0x8000/4; offset++)
{ {
int r,g,b; int r = (m_subpaletteram32[offset] >>16) & 0xff;
int g = (m_subpaletteram32[offset] >> 8) & 0xff;
r = (m_subpaletteram32[offset] >>16) & 0xff; int b = (m_subpaletteram32[offset] >> 0) & 0xff;
g = (m_subpaletteram32[offset] >> 8) & 0xff;
b = (m_subpaletteram32[offset] >> 0) & 0xff;
m_palette->set_pen_color(offset,rgb_t(r,g,b)); m_palette->set_pen_color(offset,rgb_t(r,g,b));
} }
@ -1597,8 +1576,8 @@ void konamigx_state::konamigx_555_palette_w(offs_t offset, uint32_t data, uint32
coldat = m_generic_paletteram_32[offset]; coldat = m_generic_paletteram_32[offset];
set_color_555(*m_palette, offset*2, 0, 5, 10,coldat >> 16); set_color_555(*m_palette, offset*2, 0, 5, 10, coldat >> 16);
set_color_555(*m_palette, offset*2+1, 0, 5, 10,coldat & 0xffff); set_color_555(*m_palette, offset*2 + 1, 0, 5, 10, coldat & 0xffff);
} }
// sub monitor for type 3 // sub monitor for type 3
@ -1610,20 +1589,20 @@ void konamigx_state::konamigx_555_palette2_w(offs_t offset, uint32_t data, uint3
offset += (0x4000/4); offset += (0x4000/4);
set_color_555(*m_palette, offset*2, 0, 5, 10,coldat >> 16); set_color_555(*m_palette, offset*2, 0, 5, 10, coldat >> 16);
set_color_555(*m_palette, offset*2+1, 0, 5, 10,coldat & 0xffff); set_color_555(*m_palette, offset*2 + 1, 0, 5, 10, coldat & 0xffff);
} }
void konamigx_state::konamigx_tilebank_w(offs_t offset, uint32_t data, uint32_t mem_mask) void konamigx_state::konamigx_tilebank_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{ {
if (ACCESSING_BITS_24_31) if (ACCESSING_BITS_24_31)
m_gx_tilebanks[offset*4] = (data>>24)&0xff; m_gx_tilebanks[offset*4] = (data >> 24) & 0xff;
if (ACCESSING_BITS_16_23) if (ACCESSING_BITS_16_23)
m_gx_tilebanks[offset*4+1] = (data>>16)&0xff; m_gx_tilebanks[offset*4 + 1] = (data >> 16) & 0xff;
if (ACCESSING_BITS_8_15) if (ACCESSING_BITS_8_15)
m_gx_tilebanks[offset*4+2] = (data>>8)&0xff; m_gx_tilebanks[offset*4 + 2] = (data >> 8) & 0xff;
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
m_gx_tilebanks[offset*4+3] = data&0xff; m_gx_tilebanks[offset*4 + 3] = data & 0xff;
} }
// type 1 RAM-based PSAC tilemap // type 1 RAM-based PSAC tilemap
@ -1640,5 +1619,5 @@ void konamigx_state::konamigx_t4_psacmap_w(offs_t offset, uint32_t data, uint32_
COMBINE_DATA(&m_psacram[offset]); COMBINE_DATA(&m_psacram[offset]);
m_gx_psac_tilemap->mark_tile_dirty(offset*2); m_gx_psac_tilemap->mark_tile_dirty(offset*2);
m_gx_psac_tilemap->mark_tile_dirty((offset*2)+1); m_gx_psac_tilemap->mark_tile_dirty((offset*2) + 1);
} }

View File

@ -51,12 +51,11 @@ private:
int m_roz_rombank = 0; int m_roz_rombank = 0;
tilemap_t *m_ult_936_tilemap = nullptr; tilemap_t *m_ult_936_tilemap = nullptr;
uint16_t m_clip = 0; uint16_t m_clip = 0;
uint8_t m_last_alpha_tile_mix_code = 0;
uint8_t m_sound_ctrl = 0; uint8_t m_sound_ctrl = 0;
uint8_t m_sound_nmi_clk = 0; uint8_t m_sound_nmi_clk = 0;
uint8_t m_last_alpha_tile_mix_code = 0;
uint16_t eeprom_r(offs_t offset, uint16_t mem_mask = ~0); uint16_t eeprom_r(offs_t offset, uint16_t mem_mask = ~0);
void mweeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); void mweeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
uint16_t dddeeprom_r(offs_t offset, uint16_t mem_mask = ~0); uint16_t dddeeprom_r(offs_t offset, uint16_t mem_mask = ~0);