summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/konamigx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/konamigx.cpp')
-rw-r--r--src/mame/machine/konamigx.cpp512
1 files changed, 0 insertions, 512 deletions
diff --git a/src/mame/machine/konamigx.cpp b/src/mame/machine/konamigx.cpp
deleted file mode 100644
index 53ad766b79f..00000000000
--- a/src/mame/machine/konamigx.cpp
+++ /dev/null
@@ -1,512 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:R. Belmont, Acho A. Tang, Phil Stroffolino, Olivier Galibert
-/**************************************************************************
- *
- * machine/konamigx.cpp - contains various System GX hardware abstractions
- *
- */
-
-#include "emu.h"
-#include "includes/konamigx.h"
-
-/***************************************************************************/
-/* */
-/* GX/MW Protections */
-/* */
-/***************************************************************************/
-
-/*
-
-
-K055550
--------
-
-Protection chip which performs a memset() operation.
-
-Used in Violent Storm and Ultimate Battler to clear VRAM between scenes, among
-other things. May also perform other functions since Violent Storm still isn't
-happy...
-
-Has word-wide registers as follows:
-
-0: Count of units to transfer. The write here triggers the transfer.
-1-6: Unknown
-7: Destination address, MSW
-8: Destination address, LSW
-9: Unknown
-10: Size of transfer units, MSW
-11: Size of transfer units, LSW
-12: Unknown
-13: Value to fill destination region with
-14-15: Unknown
-
-*/
-
-// K055550/K053990 protection chips, perform simple memset() and other game logic operations
-
-
-uint16_t konamigx_state::K055550_word_r(offs_t offset)
-{
- return(m_prot_data[offset]);
-}
-
-void konamigx_state::K055550_word_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- auto &mspace = m_maincpu->space(AS_PROGRAM);
- uint32_t adr, bsize, count, i, lim;
- int src, tgt, srcend, tgtend, skip, cx1, sx1, wx1, cy1, sy1, wy1, cz1, sz1, wz1, c2, s2, w2;
- int dx, dy, angle;
-
- COMBINE_DATA(m_prot_data+offset);
-
- if (offset == 0 && ACCESSING_BITS_8_15)
- {
- data >>= 8;
- switch (data)
- {
- case 0x97: // memset() (Dadandarn at 0x639dc)
- case 0x9f: // memset() (Violent Storm at 0x989c)
- adr = (m_prot_data[7] << 16) | m_prot_data[8];
- bsize = (m_prot_data[10] << 16) | m_prot_data[11];
- count = (m_prot_data[0] & 0xff) + 1;
-
- lim = adr+bsize*count;
- for(i=adr; i<lim; i+=2)
- mspace.write_word(i, m_prot_data[0x1a/2]);
- break;
-
- // WARNING: The following cases are speculation based with questionable accuracy!(AAT)
-
- case 0x87: // unknown memory write (Violent Storm at 0x00b6ea)
- // Violent Storm writes the following data to the 55550 in mode 0x87.
- // All values are hardcoded and the write happens each frame during
- // gameplay. It refers to a 32x8-word list at 0x210e00 and seems to
- // be tied with another 13x128-byte table at 0x205080.
- // Both tables appear "check-only" and have little effect on gameplay.
- count =(m_prot_data[0] & 0xff) + 1; // unknown ( byte 0x00)
- i = m_prot_data[1]; // unknown ( byte 0x1f)
- adr = m_prot_data[7]<<16 | m_prot_data[8]; // address (dword 0x210e00)
- lim = m_prot_data[9]; // unknown ( word 0x0010)
- 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)
- break;
-
- case 0xa0: // update collision detection table (Violent Storm at 0x018b42)
- 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"
- 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
-
- srcend = adr + bsize * count;
- tgtend = srcend + bsize;
-
- // let's hope GCC will inline the mem24bew calls
- for (src=adr; src<srcend; src+=bsize)
- {
- cx1 = (short)mspace.read_word(src);
- sx1 = (short)mspace.read_word(src + 2);
- wx1 = (short)mspace.read_word(src + 4);
-
- cy1 = (short)mspace.read_word(src + 6);
- sy1 = (short)mspace.read_word(src + 8);
- wy1 = (short)mspace.read_word(src +10);
-
- cz1 = (short)mspace.read_word(src +12);
- sz1 = (short)mspace.read_word(src +14);
- wz1 = (short)mspace.read_word(src +16);
-
- count = i = src + skip;
- tgt = src + bsize;
-
- for (; count<tgt; count++) mspace.write_byte(count, 0);
-
- for (; tgt<tgtend; i++, tgt+=bsize)
- {
- c2 = (short)mspace.read_word(tgt);
- s2 = (short)mspace.read_word(tgt + 2);
- w2 = (short)mspace.read_word(tgt + 4);
- if (abs((cx1+sx1)-(c2+s2))>=wx1+w2) continue; // X rejection
-
- c2 = (short)mspace.read_word(tgt + 6);
- s2 = (short)mspace.read_word(tgt + 8);
- w2 = (short)mspace.read_word(tgt +10);
- if (abs((cy1+sy1)-(c2+s2))>=wy1+w2) continue; // Y rejection
-
- c2 = (short)mspace.read_word(tgt +12);
- s2 = (short)mspace.read_word(tgt +14);
- w2 = (short)mspace.read_word(tgt +16);
- if (abs((cz1+sz1)-(c2+s2))>=wz1+w2) continue; // Z rejection
-
- mspace.write_byte(i, 0x80); // collision confirmed
- }
- }
- break;
-
- case 0xc0: // calculate object "homes-in" vector (Violent Storm at 0x03da9e)
- dx = (short)m_prot_data[0xc];
- dy = (short)m_prot_data[0xd];
-
- // it's not necessary to use lookup tables because Violent Storm
- // only calls the service once per enemy per frame.
- if (dx)
- {
- if (dy)
- {
- angle = (atan((double)dy / dx) * 128.0) / M_PI;
- if (dx < 0) angle += 128;
- i = (angle - 0x40) & 0xff;
- }
- else
- i = (dx > 0) ? 0xc0 : 0x40;
- }
- else
- if (dy > 0) i = 0;
- else
- if (dy < 0) i = 0x80;
- else
- i = machine().rand() & 0xff; // vector direction indeterminate
-
- m_prot_data[0x10] = i;
- break;
-
- default:
-// logerror("%06x: unknown K055550 command %02x\n", m_maincpu->pc(), data);
- break;
- }
- }
-}
-
-void konamigx_state::K053990_martchmp_word_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- auto &mspace = m_maincpu->space(AS_PROGRAM);
- int src_addr, src_count, src_skip;
- int dst_addr, /*dst_count,*/ dst_skip;
- int mod_addr, mod_count, mod_skip, mod_offs;
- int mode, i, element_size = 1;
- uint16_t mod_val, mod_data;
-
- COMBINE_DATA(m_prot_data+offset);
-
- if (offset == 0x0c && ACCESSING_BITS_8_15)
- {
- mode = (m_prot_data[0x0d]<<8 & 0xff00) | (m_prot_data[0x0f] & 0xff);
-
- switch (mode)
- {
- case 0xffff: // word copy
- element_size = 2;
- case 0xff00: // byte copy
- src_addr = m_prot_data[0x0];
- src_addr |= m_prot_data[0x1]<<16 & 0xff0000;
- dst_addr = m_prot_data[0x2];
- dst_addr |= m_prot_data[0x3]<<16 & 0xff0000;
- src_count = m_prot_data[0x8]>>8;
- //dst_count = m_prot_data[0x9]>>8;
- src_skip = m_prot_data[0xa] & 0xff;
- dst_skip = m_prot_data[0xb] & 0xff;
-
- if ((m_prot_data[0x8] & 0xff) == 2) src_count <<= 1;
- src_skip += element_size;
- dst_skip += element_size;
-
- if (element_size == 1)
- for (i=src_count; i; i--)
- {
- mspace.write_byte(dst_addr, mspace.read_byte(src_addr));
- src_addr += src_skip;
- dst_addr += dst_skip;
- }
- else for (i=src_count; i; i--)
- {
- mspace.write_word(dst_addr, mspace.read_word(src_addr));
- src_addr += src_skip;
- dst_addr += dst_skip;
- }
- break;
-
- case 0x00ff: // sprite list modifier
- src_addr = m_prot_data[0x0];
- src_addr |= m_prot_data[0x1]<<16 & 0xff0000;
- src_skip = m_prot_data[0x1]>>8;
- dst_addr = m_prot_data[0x2];
- dst_addr |= m_prot_data[0x3]<<16 & 0xff0000;
- dst_skip = m_prot_data[0x3]>>8;
- mod_addr = m_prot_data[0x4];
- mod_addr |= m_prot_data[0x5]<<16 & 0xff0000;
- mod_skip = m_prot_data[0x5]>>8;
- mod_offs = m_prot_data[0x8] & 0xff;
- mod_offs<<= 1;
- mod_count = 0x100;
-
- src_addr += mod_offs;
- dst_addr += mod_offs;
-
- for (i=mod_count; i; i--)
- {
- mod_val = mspace.read_word(mod_addr);
- mod_addr += mod_skip;
-
- mod_data = mspace.read_word(src_addr);
- src_addr += src_skip;
-
- mod_data += mod_val;
-
- mspace.write_word(dst_addr, mod_data);
- dst_addr += dst_skip;
- }
- break;
-
- default:
- break;
- }
- }
-}
-
-void konamigx_state::konamigx_esc_alert(uint32_t *srcbase, int srcoffs, int count, int mode) // (WARNING: assumed big endianess)
-{
- uint16_t* k053247_ram;
- m_k055673->k053247_get_ram(&k053247_ram);
-
-
-// hand-filled but should be close
-static const uint8_t ztable[7][8] =
-{
- {5,4,3,2,1,7,6,0},
- {4,3,2,1,0,7,6,5},
- {4,3,2,1,0,7,6,5},
- {3,2,1,0,5,7,4,6},
- {6,5,1,4,3,7,0,2},
- {5,4,3,2,1,7,6,0},
- {5,4,3,2,1,7,6,0}
-};
-
-static const uint8_t ptable[7][8] =
-{
- {0x00,0x00,0x00,0x10,0x20,0x00,0x00,0x30},
- {0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20},
- {0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00},
- {0x10,0x10,0x10,0x20,0x00,0x00,0x10,0x00},
- {0x00,0x00,0x20,0x00,0x10,0x00,0x20,0x20},
- {0x00,0x00,0x00,0x10,0x10,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;
- uint32_t *src, *srcend, *obj, *objend;
- uint16_t *dst;
- const uint8_t *zcode, *pcode;
-
- if (!count || !srcbase) return;
-
- if (mode == 0)
- {
- src = srcbase + srcoffs;
- dst = k053247_ram;
- data1 = count<<2;
- data2 = count<<3;
- src += data1; dst += data2; i = -data1; j = -data2;
- do
- {
- data1 = src[i];
- data2 = src[i+1];
- i += 2;
- dst[j+1] = data1;
- dst[j+3] = data2;
- data1 >>= 16;
- data2 >>= 16;
- dst[j] = data1;
- dst[j+2] = data2;
- }
- while (j += 4);
- }
- else
- {
-#define EXTRACT_ODD \
-if((data1=obj[0])&0x8000) \
-{ \
- i = data1 & 7; \
- data1 &= 0xff00; \
- dst[0] = data1 | zcode[i];\
- data1 = obj[1]; \
- dst[1] = data1>>16; \
- vpos = data1 & 0xffff; \
- data1 = obj[2]; \
- vpos += voffs; \
- dst[4] = data1; \
- vpos &= vmask; \
- hpos = data1>>16; \
- data1 = obj[3]; \
- hpos += hoffs; \
- dst[2] = vpos; \
- dst[3] = hpos; \
- dst[5] = data1>>16; \
- i = pcode[i]; \
- dst[6] = data1| i<<4; \
- dst += 8; \
- if (!(--j)) return; \
-}
-
-#define EXTRACT_EVEN \
-if((data1=obj[0])&0x80000000)\
-{ \
- dst[1] = data1; \
- data1>>= 16; \
- i = data1 & 7; \
- data1 &= 0xff00; \
- dst[0] = data1 | zcode[i]; \
- data1 = obj[1]; \
- hpos = data1 & 0xffff; \
- vpos = data1>>16; \
- hpos += hoffs; \
- vpos += voffs; \
- data1 = obj[2]; \
- vpos &= vmask; \
- dst[3] = hpos; \
- dst[2] = vpos; \
- dst[5] = data1; \
- dst[4] = data1>>16; \
- data1 = obj[3]>>16; \
- i = pcode[i]; \
- dst[6] = data1 | i<<4; \
- dst += 8; \
- if (!(--j)) return; \
-}
-
- // These suspecious looking flags might tell the ESC chip what zcode/priority combos to use.
- // At the beginning of each sprite chunk there're at least three pointers to the main ROM but
- // I can't make out anything meaningful.
- magicid = srcbase[0x71f0/4];
-
- vmask = 0x3ff;
- if (magicid != 0x11010111)
- {
- switch (magicid)
- {
- case 0x10010801: i = 6; break;
- case 0x11010010: i = 5; vmask = 0x1ff; break;
- case 0x01111018: i = 4; break;
- case 0x10010011: i = 3;
- if ((srcbase[0x1c75]&0xff)==32) m_k055555->K055555_write_reg(K55_BLEND_ENABLES,36); // (TEMPORARY)
- break;
- case 0x11010811: i = 2; break;
- case 0x10000010: i = 1; break;
- default: i = 0;
- }
- vcorr = srcbase[0x26a0/4] & 0xffff;
- hcorr = srcbase[0x26a4/4] >> 16;
- hcorr -= 10;
- }
- else
- hcorr = vcorr = i = 0;
-
- zcode = ztable[i];
- pcode = ptable[i];
-
- dst = k053247_ram;
- j = 256;
-
- // decode Vic-Viper
- if (srcbase[0x049c/4] & 0xffff0000)
- {
- hoffs = srcbase[0x0502/4] & 0xffff;
- voffs = srcbase[0x0506/4] & 0xffff;
- hoffs -= hcorr;
- voffs -= vcorr;
- obj = &srcbase[0x049e/4];
- EXTRACT_ODD
- obj = &srcbase[0x04ae/4];
- EXTRACT_ODD
- obj = &srcbase[0x04be/4];
- EXTRACT_ODD
- }
-
- // decode Lord British (the designer must be a Richard Garriot fan too:)
- if (srcbase[0x0848/4] & 0x0000ffff)
- {
- hoffs = srcbase[0x08b0/4]>>16;
- voffs = srcbase[0x08b4/4]>>16;
- hoffs -= hcorr;
- voffs -= vcorr;
- obj = &srcbase[0x084c/4];
- EXTRACT_EVEN
- obj = &srcbase[0x085c/4];
- EXTRACT_EVEN
- obj = &srcbase[0x086c/4];
- EXTRACT_EVEN
- }
-
- // decode common sprites
- src = srcbase + srcoffs;
- srcend = src + count * 0x30;
- do
- {
- if (!src[0]) continue;
- i = src[7] & 0xf;
- if (!i) continue; // reject retired or zero-element groups
- i <<= 2;
- hoffs = src[5]>>16;
- voffs = src[6]>>16;
- hoffs -= hcorr;
- voffs -= vcorr;
- obj = src + 8;
- objend = obj + i;
-
- do
- {
- EXTRACT_EVEN
- }
- while ((obj+=4)<objend);
- }
- while ((src+=0x30)<srcend);
-
- // clear residual data
- if (j) do { *dst = 0; dst += 8; } while (--j);
- }
-
-#undef EXTRACT_ODD
-#undef EXTRACT_EVEN
-}
-
-void konamigx_state::fantjour_dma_install()
-{
- save_item(NAME(m_fantjour_dma));
- save_item(NAME(m_prot_data));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0xdb0000, 0xdb001f, write32s_delegate(*this, FUNC(konamigx_state::fantjour_dma_w)));
- memset(m_fantjour_dma, 0, sizeof(m_fantjour_dma));
-}
-
-void konamigx_state::fantjour_dma_w(offs_t offset, uint32_t data, uint32_t mem_mask)
-{
- auto &mspace = m_maincpu->space(AS_PROGRAM);
- COMBINE_DATA(m_fantjour_dma + offset);
- if(!offset && ACCESSING_BITS_24_31) {
- uint32_t sa = m_fantjour_dma[1];
- // 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 da = ((m_fantjour_dma[3] & 0xffff) << 16) | ((m_fantjour_dma[4] & 0xffff0000) >> 16);
- // uint16_t ds = m_fantjour_dma[4] & 0xffff;
- uint32_t db = m_fantjour_dma[5];
-
- // uint8_t sz1 = m_fantjour_dma[0] >> 8;
- uint8_t sz2 = m_fantjour_dma[0] >> 16;
- uint8_t mode = m_fantjour_dma[0] >> 24;
-
- uint32_t x = m_fantjour_dma[6];
- uint32_t i1, i2;
-
- if(mode == 0x93)
- for(i1=0; i1 <= sz2; i1++)
- for(i2=0; i2 < db; i2+=4) {
- mspace.write_dword(da, mspace.read_dword(sa) ^ x);
- da += 4;
- sa += 4;
- }
- else if(mode == 0x8f)
- for(i1=0; i1 <= sz2; i1++)
- for(i2=0; i2 < db; i2+=4) {
- mspace.write_dword(da, x);
- da += 4;
- }
- }
-}