mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
vt1682.cpp - (Plug and Play) get some sprites displayed (#5919)
* enable sprite dma, refactor a little (nw) * (nw) * refactor (nw) * refactor (nw) * sprite work (nw) * misc work (nw) * xflip (nw)
This commit is contained in:
parent
b54cb1804b
commit
a6ef1e7558
@ -16,6 +16,17 @@
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
|
||||
#define LOG_VRAM_WRITES (1U << 1)
|
||||
#define LOG_SRAM_WRITES (1U << 2)
|
||||
|
||||
#define LOG_ALL ( LOG_VRAM_WRITES | LOG_SRAM_WRITES )
|
||||
|
||||
#define VERBOSE (0)
|
||||
#include "logmacro.h"
|
||||
|
||||
|
||||
|
||||
|
||||
class vt_vt1682_state : public driver_device
|
||||
{
|
||||
public:
|
||||
@ -309,6 +320,7 @@ private:
|
||||
|
||||
uint8_t m_2106_enable_reg;
|
||||
|
||||
uint8_t m_210d_ioconfig;
|
||||
|
||||
DECLARE_READ8_MEMBER(vt1682_2100_prgbank1_r3_r);
|
||||
DECLARE_WRITE8_MEMBER(vt1682_2100_prgbank1_r3_w);
|
||||
@ -368,6 +380,12 @@ private:
|
||||
DECLARE_READ8_MEMBER(vt1682_210e_io_ab_r);
|
||||
DECLARE_READ8_MEMBER(vt1682_210f_io_cd_r);
|
||||
|
||||
DECLARE_WRITE8_MEMBER(vt1682_210e_io_ab_w);
|
||||
DECLARE_WRITE8_MEMBER(vt1682_210f_io_cd_w);
|
||||
|
||||
DECLARE_READ8_MEMBER(vt1682_210d_ioconfig_r);
|
||||
DECLARE_WRITE8_MEMBER(vt1682_210d_ioconfig_w);
|
||||
|
||||
/* System Helpers */
|
||||
|
||||
uint16_t get_dma_sr_addr()
|
||||
@ -417,7 +435,8 @@ private:
|
||||
return ((m_2126_dma_sr_bank_addr_22_15 ) | (m_2128_dma_sr_bank_addr_24_23 << 8)) & 0x3ff;
|
||||
}
|
||||
|
||||
void do_dma_external_to_internal(uint16_t dstaddr, int count, bool is_video);
|
||||
void do_dma_external_to_internal(int data, bool is_video);
|
||||
void do_dma_internal_to_internal(int data, bool is_video);
|
||||
|
||||
/* Support */
|
||||
|
||||
@ -432,7 +451,9 @@ private:
|
||||
INTERRUPT_GEN_MEMBER(nmi);
|
||||
|
||||
bitmap_ind8 m_priority_bitmap;
|
||||
void draw_tile(int segment, int tile, int x, int y, int palbase, int pal, int is16pix_high, int is16pix_wide, int bpp, int depth, int opaque, int flipx, int flipy, screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect);
|
||||
void draw_layer(int which, int base, int opaque, screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect);
|
||||
void draw_sprites(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect);
|
||||
};
|
||||
|
||||
void vt_vt1682_state::video_start()
|
||||
@ -530,6 +551,8 @@ void vt_vt1682_state::machine_start()
|
||||
save_item(NAME(m_2128_dma_sr_bank_addr_24_23));
|
||||
|
||||
save_item(NAME(m_2106_enable_reg));
|
||||
|
||||
save_item(NAME(m_210d_ioconfig));
|
||||
}
|
||||
|
||||
void vt_vt1682_state::machine_reset()
|
||||
@ -626,6 +649,7 @@ void vt_vt1682_state::machine_reset()
|
||||
|
||||
m_2106_enable_reg = 0;
|
||||
|
||||
m_210d_ioconfig = 0;
|
||||
|
||||
update_banks();
|
||||
|
||||
@ -935,7 +959,7 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2001_vblank_r)
|
||||
uint8_t ret = 0x00;
|
||||
|
||||
int sp_err = 0; // too many sprites per lien
|
||||
int vblank = 0; // in vblank?
|
||||
int vblank = m_screen->vpos() > 240 ? 1 : 0; // in vblank?
|
||||
|
||||
ret |= sp_err << 6;
|
||||
ret |= vblank << 7;
|
||||
@ -1033,10 +1057,8 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_2004_sprram_data_w)
|
||||
uint16_t spriteram_address = get_spriteram_addr();
|
||||
m_spriteram->write8(spriteram_address, data);
|
||||
|
||||
logerror("%s: vt1682_2004_sprram_data_w writing: %02x to SpriteRam Address %04x\n", machine().describe_context(), data, spriteram_address);
|
||||
//spriteram_address++; // auto inc
|
||||
LOGMASKED(LOG_SRAM_WRITES, "%s: vt1682_2004_sprram_data_w writing: %02x to SpriteRam Address %04x\n", machine().describe_context(), data, spriteram_address);
|
||||
inc_spriteram_addr();
|
||||
//set_spriteram_addr(spriteram_address); // update registers
|
||||
}
|
||||
|
||||
|
||||
@ -1120,7 +1142,7 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_2007_vram_data_w)
|
||||
{
|
||||
uint16_t vram_address = get_vram_addr();
|
||||
m_vram->write8(vram_address, data);
|
||||
//logerror("%s: vt1682_2007_vram_data_w writing: %02x to VideoRam Address %04x\n", machine().describe_context(), data, vram_address);
|
||||
LOGMASKED(LOG_VRAM_WRITES, "%s: vt1682_2007_vram_data_w writing: %02x to VideoRam Address %04x\n", machine().describe_context(), data, vram_address);
|
||||
vram_address++; // auto inc
|
||||
set_vram_addr(vram_address); // update registers
|
||||
}
|
||||
@ -2326,6 +2348,12 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_2100_prgbank1_r3_w)
|
||||
0x04 - Double
|
||||
0x02 - ROM SEL
|
||||
0x01 - PRAM
|
||||
|
||||
TV Mode settings 0 = NTSC, 1 = PAL M, 2 = PAL N, 3 = PAL
|
||||
see clocks near machine_config
|
||||
|
||||
ROM SEL is which CPU the internal ROM maps to (if used) 0 = Main CPU, 1 = Sound CPU
|
||||
|
||||
*/
|
||||
|
||||
WRITE8_MEMBER(vt_vt1682_state::vt1682_2105_comr6_tvmodes_w)
|
||||
@ -2556,6 +2584,30 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_210c_prgbank1_r2_w)
|
||||
0x01 - IOA OE
|
||||
*/
|
||||
|
||||
READ8_MEMBER(vt_vt1682_state::vt1682_210d_ioconfig_r)
|
||||
{
|
||||
uint8_t ret = m_210d_ioconfig;
|
||||
logerror("%s: vt1682_210d_ioconfig_r returning: %02x\n", machine().describe_context(), ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(vt_vt1682_state::vt1682_210d_ioconfig_w)
|
||||
{
|
||||
logerror("%s: vt1682_210d_ioconfig_w writing: %02x ( IOD_ENB:%1x IOD_OE:%1x | IOC_ENB:%1x IOC_OE:%1x | IOB_ENB:%1x IOB_OE:%1x | IOA_ENB:%1x IOA_OE:%1x )\n", machine().describe_context(), data,
|
||||
(data & 0x80) ? 1 : 0,
|
||||
(data & 0x40) ? 1 : 0,
|
||||
(data & 0x20) ? 1 : 0,
|
||||
(data & 0x10) ? 1 : 0,
|
||||
(data & 0x08) ? 1 : 0,
|
||||
(data & 0x04) ? 1 : 0,
|
||||
(data & 0x02) ? 1 : 0,
|
||||
(data & 0x01) ? 1 : 0);
|
||||
|
||||
m_210d_ioconfig = data;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Address 0x210e r/w (MAIN CPU)
|
||||
|
||||
@ -2571,11 +2623,18 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_210c_prgbank1_r2_w)
|
||||
|
||||
READ8_MEMBER(vt_vt1682_state::vt1682_210e_io_ab_r)
|
||||
{
|
||||
//uint8_t ret = ioport("IN0")->read();
|
||||
uint8_t ret = machine().rand();
|
||||
// logerror("%s: vt1682_210e_io_ab_r returning: %02x\n", machine().describe_context(), ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(vt_vt1682_state::vt1682_210e_io_ab_w)
|
||||
{
|
||||
logerror("%s: vt1682_210e_io_ab_w writing: %02x (portb: %1x porta: %1x)\n", machine().describe_context(), data, (data & 0xf0) >> 4, data & 0x0f);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Address 0x210f r/w (MAIN CPU)
|
||||
@ -2592,11 +2651,18 @@ READ8_MEMBER(vt_vt1682_state::vt1682_210e_io_ab_r)
|
||||
|
||||
READ8_MEMBER(vt_vt1682_state::vt1682_210f_io_cd_r)
|
||||
{
|
||||
//uint8_t ret = ioport("IN1")->read();
|
||||
uint8_t ret = machine().rand();
|
||||
// logerror("%s: vt1682_210f_io_cd_r returning: %02x\n", machine().describe_context(), ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(vt_vt1682_state::vt1682_210f_io_cd_w)
|
||||
{
|
||||
logerror("%s: vt1682_210f_io_cd_w writing: %02x (portd: %1x portc: %1x)\n", machine().describe_context(), data, (data & 0xf0) >> 4, data & 0x0f);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Address 0x2110 READ (MAIN CPU)
|
||||
|
||||
@ -3206,10 +3272,15 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2127_dma_status_r)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void vt_vt1682_state::do_dma_external_to_internal(uint16_t dstaddr, int count, bool is_video)
|
||||
void vt_vt1682_state::do_dma_external_to_internal(int data, bool is_video)
|
||||
{
|
||||
int count = data * 2;
|
||||
if (count == 0)
|
||||
count = 0x200;
|
||||
|
||||
int srcbank = get_dma_sr_bank_ddr();
|
||||
int srcaddr = get_dma_sr_addr();
|
||||
uint16_t dstaddr = get_dma_dt_addr();
|
||||
|
||||
if (is_video)
|
||||
logerror("Doing DMA, External to Internal (VRAM/SRAM) src: %08x dest: %04x length: %03x\n", srcaddr | srcbank<<15, dstaddr, count);
|
||||
@ -3233,6 +3304,39 @@ void vt_vt1682_state::do_dma_external_to_internal(uint16_t dstaddr, int count, b
|
||||
}
|
||||
}
|
||||
|
||||
void vt_vt1682_state::do_dma_internal_to_internal(int data, bool is_video)
|
||||
{
|
||||
int count = data * 2;
|
||||
if (count == 0)
|
||||
count = 0x200;
|
||||
|
||||
int srcaddr = get_dma_sr_addr();
|
||||
uint16_t dstaddr = get_dma_dt_addr();
|
||||
|
||||
if (is_video)
|
||||
logerror("Doing DMA, Internal to Internal (VRAM/SRAM) src: %04x dest: %04x length: %03x\n", srcaddr, dstaddr, count);
|
||||
else
|
||||
logerror("Doing DMA, Internal to Internal src: %04x dest: %04x length: %03x\n", srcaddr, dstaddr, count);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
address_space &mem = m_maincpu->space(AS_PROGRAM);
|
||||
|
||||
srcaddr = get_dma_sr_addr();
|
||||
uint8_t dat = mem.read_byte(srcaddr);
|
||||
srcaddr++;
|
||||
|
||||
mem.write_byte(dstaddr, dat);
|
||||
|
||||
if (!is_video)
|
||||
dstaddr++;
|
||||
|
||||
// update registers
|
||||
set_dma_sr_addr(srcaddr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
WRITE8_MEMBER(vt_vt1682_state::vt1682_2127_dma_size_trigger_w)
|
||||
{
|
||||
@ -3263,11 +3367,8 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_2127_dma_size_trigger_w)
|
||||
return;
|
||||
}
|
||||
|
||||
int count = data * 2;
|
||||
if (count == 0)
|
||||
count = 0x200;
|
||||
|
||||
do_dma_external_to_internal(dstaddr, count, get_dma_dt_is_video());
|
||||
do_dma_external_to_internal(data, get_dma_dt_is_video());
|
||||
|
||||
return;
|
||||
}
|
||||
@ -3276,6 +3377,8 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_2127_dma_size_trigger_w)
|
||||
{
|
||||
if (get_dma_dt_isext())
|
||||
{
|
||||
// this is only likely if there is RAM in the usual ROM space
|
||||
|
||||
// Source Internal
|
||||
// Dest External
|
||||
int dstbank = get_dma_sr_bank_ddr();
|
||||
@ -3305,11 +3408,7 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_2127_dma_size_trigger_w)
|
||||
return;
|
||||
}
|
||||
|
||||
int count = data * 2;
|
||||
if (count == 0)
|
||||
count = 0x200;
|
||||
|
||||
logerror("Unhandled DMA with Params src: %04x dest: %04x length: %03x\n", srcaddr, dstaddr, count );
|
||||
do_dma_internal_to_internal(data, get_dma_dt_is_video());
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -4266,6 +4365,137 @@ WRITE8_MEMBER(vt_vt1682_state::vt1682_2128_dma_sr_bank_addr_24_23_w)
|
||||
0x01 - IOB PLH
|
||||
*/
|
||||
|
||||
|
||||
void vt_vt1682_state::draw_tile(int segment, int tile, int x, int y, int palbase, int pal, int is16pix_high, int is16pix_wide, int bpp, int depth, int opaque, int flipx, int flipy, screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect)
|
||||
{
|
||||
|
||||
if (bpp == 3) pal = 0x0;
|
||||
if (bpp == 2) pal &= 0xc;
|
||||
|
||||
{
|
||||
int startaddress = segment;
|
||||
int linebytes;
|
||||
|
||||
if (bpp == 3)
|
||||
{
|
||||
if (is16pix_wide)
|
||||
{
|
||||
linebytes = 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
linebytes = 8;
|
||||
}
|
||||
}
|
||||
else if (bpp == 2)
|
||||
{
|
||||
if (is16pix_wide)
|
||||
{
|
||||
linebytes = 12;
|
||||
}
|
||||
else
|
||||
{
|
||||
linebytes = 6;
|
||||
}
|
||||
}
|
||||
else //if (bpp == 1) // or 0
|
||||
{
|
||||
if (is16pix_wide)
|
||||
{
|
||||
linebytes = 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
linebytes = 4;
|
||||
}
|
||||
}
|
||||
int tilesize_wide = is16pix_wide ? 16 : 8;
|
||||
int tilesize_high = is16pix_high ? 16 : 8;
|
||||
|
||||
int tilebytes = linebytes * tilesize_high;
|
||||
|
||||
startaddress += tilebytes * tile;
|
||||
|
||||
for (int yy = 0; yy < tilesize_high; yy++) // tile y lines
|
||||
{
|
||||
int currentaddress;
|
||||
|
||||
if (!flipy)
|
||||
currentaddress = startaddress + yy * linebytes;
|
||||
else
|
||||
currentaddress = startaddress + ((tilesize_high - 1) - yy) * linebytes;
|
||||
|
||||
int line = y + yy;
|
||||
|
||||
if (line >= cliprect.min_y && line <= cliprect.max_y)
|
||||
{
|
||||
uint32_t* dstptr = &bitmap.pix32(line);
|
||||
uint8_t* priptr = &m_priority_bitmap.pix8(line);
|
||||
|
||||
int shift_amount, mask, bytes_in;
|
||||
if (bpp == 3) // (8bpp)
|
||||
{
|
||||
shift_amount = 8;
|
||||
mask = 0xff;
|
||||
bytes_in = 4;
|
||||
}
|
||||
else if (bpp == 2) // (6bpp)
|
||||
{
|
||||
shift_amount = 6;
|
||||
mask = 0x3f;
|
||||
bytes_in = 3;
|
||||
}
|
||||
else // 1 / 0 (4bpp)
|
||||
{
|
||||
shift_amount = 4;
|
||||
mask = 0x0f;
|
||||
bytes_in = 2;
|
||||
}
|
||||
|
||||
int xbase = x;;
|
||||
|
||||
for (int xx = 0; xx < tilesize_wide; xx += 4) // tile x pixels
|
||||
{
|
||||
// draw 4 pixels
|
||||
uint32_t pixdata = 0;
|
||||
|
||||
int shift = 0;
|
||||
for (int i = 0; i < bytes_in; i++)
|
||||
{
|
||||
pixdata |= m_fullrom->read8(currentaddress) << shift; currentaddress++;
|
||||
shift += 8;
|
||||
}
|
||||
|
||||
shift = 0;
|
||||
for (int ii = 0; ii < 4; ii++)
|
||||
{
|
||||
uint8_t pen = (pixdata >> shift)& mask;
|
||||
if (opaque || pen)
|
||||
{
|
||||
int xdraw_real;
|
||||
if (!flipx)
|
||||
xdraw_real = xbase + xx + ii; // pixel position
|
||||
else
|
||||
xdraw_real = xbase + ((tilesize_wide - 1) - xx - ii);
|
||||
|
||||
if (xdraw_real >= cliprect.min_x && xdraw_real <= cliprect.max_x)
|
||||
{
|
||||
if (depth < priptr[xdraw_real])
|
||||
{
|
||||
const pen_t* paldata = m_palette->pens();
|
||||
dstptr[xdraw_real] = paldata[(palbase + pen) | (pal << 4)];
|
||||
priptr[xdraw_real] = depth;
|
||||
}
|
||||
}
|
||||
}
|
||||
shift += shift_amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void vt_vt1682_state::draw_layer(int which, int base, int opaque, screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect)
|
||||
{
|
||||
// m_main_control_bk[0]
|
||||
@ -4311,6 +4541,33 @@ void vt_vt1682_state::draw_layer(int which, int base, int opaque, screen_device&
|
||||
|
||||
int count = base;
|
||||
|
||||
|
||||
int palselect;
|
||||
if (which == 0) palselect = m_200f_bk_pal_sel & 0x03;
|
||||
else palselect = (m_200f_bk_pal_sel & 0x0c)>>2;
|
||||
|
||||
int palbase;
|
||||
|
||||
if (palselect == 0)
|
||||
{
|
||||
// 'disable' ?
|
||||
return;
|
||||
}
|
||||
else if (palselect == 1)
|
||||
{
|
||||
palbase = 0x100;
|
||||
}
|
||||
else if (palselect == 2)
|
||||
{
|
||||
palbase = 0x000;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 'both' ? (how?)
|
||||
palbase = machine().rand() & 0xff;
|
||||
}
|
||||
|
||||
|
||||
for (int y = 0; y < (bk_tilesize ? 16 : 32); y++)
|
||||
{
|
||||
for (int x = 0; x < (bk_tilesize ? 16 : 32); x++)
|
||||
@ -4324,115 +4581,13 @@ void vt_vt1682_state::draw_layer(int which, int base, int opaque, screen_device&
|
||||
int tile = word & 0x0fff;
|
||||
uint8_t pal = (word & 0xf000) >> 12;
|
||||
|
||||
if (bk_tilebpp == 3) pal = 0x0;
|
||||
if (bk_tilebpp == 2) pal &= 0xc;
|
||||
|
||||
|
||||
{
|
||||
int startaddress = segment;
|
||||
|
||||
if (bk_tilebpp == 3)
|
||||
{
|
||||
if (bk_tilesize)
|
||||
{
|
||||
startaddress += 256 * tile;
|
||||
}
|
||||
else
|
||||
{
|
||||
startaddress += 64 * tile;
|
||||
}
|
||||
}
|
||||
else if (bk_tilebpp == 2)
|
||||
{
|
||||
if (bk_tilesize)
|
||||
{
|
||||
startaddress += 192 * tile;
|
||||
}
|
||||
else
|
||||
{
|
||||
startaddress += 48 * tile;
|
||||
}
|
||||
}
|
||||
else //if (bk_tilebpp == 1) // or 0
|
||||
{
|
||||
if (bk_tilesize)
|
||||
{
|
||||
startaddress += 128 * tile;
|
||||
}
|
||||
else
|
||||
{
|
||||
startaddress += 32 * tile;
|
||||
}
|
||||
}
|
||||
|
||||
const pen_t* paldata = m_palette->pens();
|
||||
int palbase;
|
||||
|
||||
if (which == 0) palbase = 0x100;
|
||||
else palbase = 0x000;
|
||||
|
||||
int currentadddress = startaddress;
|
||||
for (int yy = 0; yy < (bk_tilesize ? 16 : 8); yy++)
|
||||
{
|
||||
int line = y * (bk_tilesize ? 16 : 8) + yy;
|
||||
|
||||
uint32_t* dstptr = &bitmap.pix32(line);
|
||||
uint8_t* priptr = &m_priority_bitmap.pix8(line);
|
||||
|
||||
for (int xx = 0; xx < (bk_tilesize ? 16 : 8); xx += 4)
|
||||
{
|
||||
uint32_t pixdata;
|
||||
if (bk_tilebpp == 3)
|
||||
{
|
||||
pixdata = m_fullrom->read8(currentadddress) << 0; currentadddress++;
|
||||
pixdata |= m_fullrom->read8(currentadddress) << 8; currentadddress++;
|
||||
pixdata |= m_fullrom->read8(currentadddress) << 16; currentadddress++;
|
||||
pixdata |= m_fullrom->read8(currentadddress) << 24; currentadddress++;
|
||||
|
||||
uint8_t pen;
|
||||
int xdraw = x * (bk_tilesize ? 16 : 8);
|
||||
int shift = 0;
|
||||
for (int ii = 0; ii < 4; ii++)
|
||||
{
|
||||
pen = (pixdata >> shift) & 0xff;
|
||||
if (opaque || pen) { int xoff = xdraw + xx + ii; if (bk_depth < priptr[xoff]) { dstptr[xoff] = paldata[palbase + pen]; priptr[xoff] = bk_depth; } }
|
||||
shift += 8;
|
||||
}
|
||||
}
|
||||
else if (bk_tilebpp == 2)
|
||||
{
|
||||
pixdata = m_fullrom->read8(currentadddress) << 0; currentadddress++;
|
||||
pixdata |= m_fullrom->read8(currentadddress) << 8; currentadddress++;
|
||||
pixdata |= m_fullrom->read8(currentadddress) << 16; currentadddress++;
|
||||
|
||||
uint8_t pen;
|
||||
int xdraw = x * (bk_tilesize ? 16 : 8);
|
||||
int shift = 0;
|
||||
for (int ii = 0; ii < 4; ii++)
|
||||
{
|
||||
pen = ((pixdata >> shift) & 0x3f);
|
||||
if (opaque || pen) { int xoff = xdraw + xx + ii; if (bk_depth < priptr[xoff]) { dstptr[xoff] = paldata[palbase + (pen | (pal << 4))]; priptr[xoff] = bk_depth; } }
|
||||
shift += 6;
|
||||
}
|
||||
}
|
||||
else //if (bk_tilebpp == 1)// or 0
|
||||
{
|
||||
pixdata = m_fullrom->read8(currentadddress) << 0; currentadddress++;
|
||||
pixdata |= m_fullrom->read8(currentadddress) << 8; currentadddress++;
|
||||
|
||||
uint8_t pen;
|
||||
int xdraw = x * (bk_tilesize ? 16 : 8);
|
||||
int shift = 0;
|
||||
for (int ii = 0; ii < 4; ii++)
|
||||
{
|
||||
pen = ((pixdata >> shift) & 0x0f);
|
||||
if (opaque || pen) { int xoff = xdraw + xx + ii; if (bk_depth < priptr[xoff]) { dstptr[xoff] = paldata[palbase + (pen | (pal << 4))]; priptr[xoff] = bk_depth; } }
|
||||
shift += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int xpos = x * (bk_tilesize ? 16 : 8);
|
||||
int ypos = y * (bk_tilesize ? 16 : 8);
|
||||
|
||||
draw_tile(segment, tile, xpos, ypos, palbase, pal, bk_tilesize, bk_tilesize, bk_tilebpp, (bk_depth*2)+1, opaque, 0, 0, screen, bitmap, cliprect);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4448,6 +4603,55 @@ void vt_vt1682_state::draw_layer(int which, int base, int opaque, screen_device&
|
||||
}
|
||||
}
|
||||
|
||||
void vt_vt1682_state::draw_sprites(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect)
|
||||
{
|
||||
int sp_en = (m_2018_spregs & 0x04) >> 2;
|
||||
//int sp_pal_sel = (m_2018_spregs & 0x08) >> 3;
|
||||
int sp_size = (m_2018_spregs & 0x03);
|
||||
|
||||
int segment = m_201a_sp_segment_7_0;
|
||||
segment |= m_201b_sp_segment_11_8 << 8;
|
||||
segment = segment * 0x2000;
|
||||
// if we don't do the skipping in inc_spriteram_addr this would need to be 5 instead
|
||||
const int SPRITE_STEP = 8;
|
||||
|
||||
|
||||
if (sp_en)
|
||||
{
|
||||
for (int i = 0; i < 240; i++)
|
||||
{
|
||||
int tilenum = m_spriteram->read8((i * SPRITE_STEP) + 0);
|
||||
int attr0 = m_spriteram->read8((i * SPRITE_STEP) + 1);
|
||||
int x = m_spriteram->read8((i * SPRITE_STEP) + 2);
|
||||
int attr1 = m_spriteram->read8((i * SPRITE_STEP) + 3);
|
||||
int y = m_spriteram->read8((i * SPRITE_STEP) + 4);
|
||||
int attr2 = m_spriteram->read8((i * SPRITE_STEP) + 5);
|
||||
|
||||
tilenum |= (attr0 & 0x0f) << 8;
|
||||
int pal = (attr0 & 0xf0) >> 4;
|
||||
|
||||
int flipx = (attr1 & 0x02) >> 1;
|
||||
int flipy = (attr1 & 0x04) >> 2;
|
||||
|
||||
// sp_pal_sel also influences this
|
||||
int palbase;
|
||||
if (attr2 & 0x02)
|
||||
palbase = 0x000;
|
||||
else
|
||||
palbase = 0x100;
|
||||
|
||||
if (attr2 & 0x01)
|
||||
y -= 256;
|
||||
|
||||
if (attr1 & 0x01)
|
||||
x -= 256;
|
||||
|
||||
|
||||
draw_tile(segment, tilenum, x, y, palbase, pal, sp_size & 0x2, sp_size&0x1, 0, 0, 0, flipx, flipy, screen, bitmap, cliprect);
|
||||
}
|
||||
}
|
||||
// if more than 16 sprites on any line 0x2001 bit 0x40 (SP_ERR) should be set (updated every line, can only be read in HBLANK)
|
||||
}
|
||||
|
||||
uint32_t vt_vt1682_state::screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect)
|
||||
{
|
||||
@ -4458,6 +4662,8 @@ uint32_t vt_vt1682_state::screen_update(screen_device& screen, bitmap_rgb32& bit
|
||||
|
||||
draw_layer(1, 0x800, 0, screen, bitmap, cliprect);
|
||||
|
||||
draw_sprites(screen, bitmap, cliprect);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -4562,9 +4768,9 @@ void vt_vt1682_state::vt_vt1682_map(address_map &map)
|
||||
map(0x210a, 0x210a).rw(FUNC(vt_vt1682_state::vt1682_210a_prgbank0_r3_r), FUNC(vt_vt1682_state::vt1682_210a_prgbank0_r3_w));
|
||||
map(0x210b, 0x210b).rw(FUNC(vt_vt1682_state::vt1682_210b_misc_cs_prg0_bank_sel_r), FUNC(vt_vt1682_state::vt1682_210b_misc_cs_prg0_bank_sel_w));
|
||||
map(0x210c, 0x210c).rw(FUNC(vt_vt1682_state::vt1682_210c_prgbank1_r2_r), FUNC(vt_vt1682_state::vt1682_210c_prgbank1_r2_w));
|
||||
|
||||
map(0x210e, 0x210e).r(FUNC(vt_vt1682_state::vt1682_210e_io_ab_r));
|
||||
map(0x210f, 0x210f).r(FUNC(vt_vt1682_state::vt1682_210f_io_cd_r));
|
||||
map(0x210d, 0x210d).rw(FUNC(vt_vt1682_state::vt1682_210d_ioconfig_r),FUNC(vt_vt1682_state::vt1682_210d_ioconfig_w));
|
||||
map(0x210e, 0x210e).rw(FUNC(vt_vt1682_state::vt1682_210e_io_ab_r),FUNC(vt_vt1682_state::vt1682_210e_io_ab_w));
|
||||
map(0x210f, 0x210f).rw(FUNC(vt_vt1682_state::vt1682_210f_io_cd_r),FUNC(vt_vt1682_state::vt1682_210f_io_cd_w));
|
||||
|
||||
// either reads/writes are on different addresses or our source info is incorrect
|
||||
map(0x2110, 0x2110).rw(FUNC(vt_vt1682_state::vt1682_prgbank0_r4_r), FUNC(vt_vt1682_state::vt1682_prgbank1_r0_w));
|
||||
@ -4593,6 +4799,57 @@ void vt_vt1682_state::vt_vt1682_map(address_map &map)
|
||||
|
||||
|
||||
static INPUT_PORTS_START( intec )
|
||||
PORT_START("IN0")
|
||||
PORT_DIPNAME( 0x01, 0x01, "IN0" )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
PORT_START("IN1")
|
||||
PORT_DIPNAME( 0x01, 0x01, "IN1" )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -4672,6 +4929,11 @@ GFXDECODE_END
|
||||
// NTSC uses XTAL(21'477'272) Sound CPU runs at exactly this, Main CPU runs at this / 4
|
||||
// PAL uses XTAL(26'601'712) Sound CPU runs at exactly this, Main CPU runs at this / 5
|
||||
|
||||
// can also be used with the following
|
||||
// PAL M 21.453669MHz
|
||||
// PAL N 21.492336MHz
|
||||
|
||||
|
||||
void vt_vt1682_state::vt_vt1682(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
@ -4682,6 +4944,7 @@ void vt_vt1682_state::vt_vt1682(machine_config &config)
|
||||
M6502(config, m_soundcpu, XTAL(21'477'272));
|
||||
m_soundcpu->set_addrmap(AS_PROGRAM, &vt_vt1682_state::vt_vt1682_sound_map);
|
||||
|
||||
config.set_maximum_quantum(attotime::from_hz(6000));
|
||||
|
||||
ADDRESS_MAP_BANK(config, m_fullrom).set_map(&vt_vt1682_state::rom_map).set_options(ENDIANNESS_NATIVE, 8, 25, 0x2000000);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user