mirror of
https://github.com/holub/mame
synced 2025-10-05 16:50:57 +03:00
made m82 type hardware switch tilemap sizes on the fly (nw)
This commit is contained in:
parent
27f2992c94
commit
8167704ef0
@ -123,7 +123,7 @@ Ken-Go / Lightning Swords 1991 M84-A-A + M84-B-B Encrypted
|
||||
Hammering Harry
|
||||
|
||||
TODO:
|
||||
- majtitle_gfx_ctrl_w is unknown, it seems to be used to disable rowscroll,
|
||||
- m82_gfx_ctrl_w is unknown, it seems to be used to disable rowscroll,
|
||||
and maybe other things
|
||||
|
||||
- Maybe there is a layer enable register, e.g. nspirit shows (for an instant)
|
||||
@ -1038,7 +1038,7 @@ static ADDRESS_MAP_START( poundfor_portmap, AS_IO, 16, m72_state )
|
||||
AM_RANGE(0x86, 0x87) AM_WRITE(scrollx2_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( majtitle_portmap, AS_IO, 16, m72_state )
|
||||
static ADDRESS_MAP_START( m82_portmap, AS_IO, 16, m72_state )
|
||||
AM_RANGE(0x00, 0x01) AM_READ_PORT("IN0")
|
||||
AM_RANGE(0x02, 0x03) AM_READ_PORT("IN1")
|
||||
AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW")
|
||||
@ -1049,7 +1049,10 @@ static ADDRESS_MAP_START( majtitle_portmap, AS_IO, 16, m72_state )
|
||||
AM_RANGE(0x82, 0x83) AM_WRITE(scrollx1_w)
|
||||
AM_RANGE(0x84, 0x85) AM_WRITE(scrolly2_w)
|
||||
AM_RANGE(0x86, 0x87) AM_WRITE(scrollx2_w)
|
||||
AM_RANGE(0x8e, 0x8f) AM_WRITE(majtitle_gfx_ctrl_w)
|
||||
|
||||
// these ports control the tilemap sizes, rowscroll etc. that m82 has, exact bit usage not known (maybe one for each layer?)
|
||||
AM_RANGE(0x8c, 0x8d) AM_WRITE(m82_tm_ctrl_w)
|
||||
AM_RANGE(0x8e, 0x8f) AM_WRITE(m82_gfx_ctrl_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( m81_portmap, AS_IO, 16, m72_state )
|
||||
@ -2071,12 +2074,12 @@ M82-A-A as the top board
|
||||
M82-B-A and as the bottom board
|
||||
|
||||
*/
|
||||
static MACHINE_CONFIG_START( m82_large, m72_state )
|
||||
static MACHINE_CONFIG_START( m82, m72_state )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
|
||||
MCFG_CPU_PROGRAM_MAP(majtitle_map)
|
||||
MCFG_CPU_IO_MAP(majtitle_portmap)
|
||||
MCFG_CPU_IO_MAP(m82_portmap)
|
||||
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("upd71059c", pic8259_device, inta_cb)
|
||||
|
||||
MCFG_CPU_ADD("soundcpu", Z80, SOUND_CLOCK)
|
||||
@ -2093,23 +2096,14 @@ static MACHINE_CONFIG_START( m82_large, m72_state )
|
||||
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update_majtitle)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update_m82)
|
||||
MCFG_SCREEN_PALETTE("palette")
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(m72_state,m82_large)
|
||||
MCFG_VIDEO_START_OVERRIDE(m72_state,m82)
|
||||
|
||||
MCFG_FRAGMENT_ADD(m72_audio_chips)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
// this is a conversion of Major Title
|
||||
static MACHINE_CONFIG_DERIVED( m82_small, m82_large ) // m82
|
||||
MCFG_VIDEO_START_OVERRIDE(m72_state,m82_small)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Pound for Pound uses
|
||||
M85-A-B / M85-B
|
||||
@ -3722,8 +3716,8 @@ GAME( 1989, rtype2, 0, rtype2, rtype2, driver_device, 0,
|
||||
GAME( 1989, rtype2j, rtype2, rtype2, rtype2, driver_device, 0, ROT0, "Irem", "R-Type II (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1989, rtype2jc, rtype2, rtype2, rtype2, driver_device, 0, ROT0, "Irem", "R-Type II (Japan, revision C)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1990, majtitle, 0, m82_large, rtype2, driver_device, 0, ROT0, "Irem", "Major Title (World)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // M82-A-A + M82-B-A
|
||||
GAME( 1990, majtitlej, majtitle, m82_large, rtype2, driver_device, 0, ROT0, "Irem", "Major Title (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // ^
|
||||
GAME( 1990, majtitle, 0, m82, rtype2, driver_device, 0, ROT0, "Irem", "Major Title (World)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // M82-A-A + M82-B-A
|
||||
GAME( 1990, majtitlej, majtitle, m82, rtype2, driver_device, 0, ROT0, "Irem", "Major Title (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // ^
|
||||
|
||||
GAME( 1990, hharry, 0, m81_hharry, m81_hharry,driver_device,0, ROT0, "Irem", "Hammerin' Harry (World, M81)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1990, hharryu, hharry, hharryu, hharry, driver_device, 0, ROT0, "Irem America", "Hammerin' Harry (US, M84)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
|
||||
@ -3734,7 +3728,7 @@ GAME( 1990, poundfor, 0, poundfor, poundfor, driver_device, 0,
|
||||
GAME( 1990, poundforj, poundfor, poundfor, poundfor, driver_device, 0, ROT270, "Irem", "Pound for Pound (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // ^
|
||||
GAME( 1990, poundforu, poundfor, poundfor, poundfor, driver_device, 0, ROT270, "Irem America", "Pound for Pound (US)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // ^
|
||||
|
||||
GAME( 1990, airduel, 0, m82_small, airduel, driver_device, 0, ROT270, "Irem", "Air Duel (World, M82-A-A + M82-B-A)", MACHINE_SUPPORTS_SAVE ) // Major Title conversion
|
||||
GAME( 1990, airduel, 0, m82, airduel, driver_device, 0, ROT270, "Irem", "Air Duel (World, M82-A-A + M82-B-A)", MACHINE_SUPPORTS_SAVE ) // Major Title conversion
|
||||
GAME( 1990, airduelm72, airduel, m72, airduel, m72_state, airduelm72, ROT270, "Irem", "Air Duel (Japan, M72)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1991, cosmccop, 0, cosmccop, gallop, driver_device, 0, ROT0, "Irem", "Cosmic Cop (World)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -37,7 +37,7 @@ public:
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_videoram1(*this, "videoram1"),
|
||||
m_videoram2(*this, "videoram2"),
|
||||
m_majtitle_rowscrollram(*this, "majtitle_rowscr"),
|
||||
m_m82_rowscrollram(*this, "majtitle_rowscr"),
|
||||
m_spriteram2(*this, "spriteram2"),
|
||||
m_soundram(*this, "soundram"),
|
||||
m_generic_paletteram_16(*this, "paletteram"),
|
||||
@ -45,7 +45,9 @@ public:
|
||||
m_upd71059c(*this, "upd71059c"),
|
||||
m_fg_source(0),
|
||||
m_bg_source(0),
|
||||
m_m81_b_b_j3(*this, "JumperJ3")
|
||||
m_m81_b_b_j3(*this, "JumperJ3"),
|
||||
m_m82_rowscroll(0),
|
||||
m_m82_tmcontrol(0)
|
||||
{ }
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
@ -60,7 +62,7 @@ public:
|
||||
required_shared_ptr<UINT16> m_spriteram;
|
||||
required_shared_ptr<UINT16> m_videoram1;
|
||||
required_shared_ptr<UINT16> m_videoram2;
|
||||
optional_shared_ptr<UINT16> m_majtitle_rowscrollram;
|
||||
optional_shared_ptr<UINT16> m_m82_rowscrollram;
|
||||
optional_shared_ptr<UINT16> m_spriteram2;
|
||||
optional_shared_ptr<UINT8> m_soundram;
|
||||
required_shared_ptr<UINT16> m_generic_paletteram_16;
|
||||
@ -75,6 +77,7 @@ public:
|
||||
UINT16 *m_buffered_spriteram;
|
||||
tilemap_t *m_fg_tilemap;
|
||||
tilemap_t *m_bg_tilemap;
|
||||
tilemap_t *m_bg_tilemap_large;
|
||||
INT32 m_scrollx1;
|
||||
INT32 m_scrolly1;
|
||||
INT32 m_scrollx2;
|
||||
@ -90,7 +93,8 @@ public:
|
||||
int m_diff[4];
|
||||
|
||||
// majtitle specific
|
||||
int m_majtitle_rowscroll;
|
||||
int m_m82_rowscroll;
|
||||
UINT16 m_m82_tmcontrol;
|
||||
|
||||
// m72_i8751 specific
|
||||
UINT8 m_mcu_snd_cmd_latch;
|
||||
@ -141,7 +145,8 @@ public:
|
||||
DECLARE_WRITE16_MEMBER(gallop_sample_trigger_w);
|
||||
DECLARE_READ16_MEMBER(poundfor_trackball_r);
|
||||
DECLARE_WRITE16_MEMBER(rtype2_port02_w);
|
||||
DECLARE_WRITE16_MEMBER(majtitle_gfx_ctrl_w);
|
||||
DECLARE_WRITE16_MEMBER(m82_gfx_ctrl_w);
|
||||
DECLARE_WRITE16_MEMBER(m82_tm_ctrl_w);
|
||||
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_tile_info);
|
||||
@ -149,7 +154,7 @@ public:
|
||||
TILE_GET_INFO_MEMBER(rtype2_get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(rtype2_get_fg_tile_info);
|
||||
|
||||
TILEMAP_MAPPER_MEMBER(majtitle_scan_rows);
|
||||
TILEMAP_MAPPER_MEMBER(m82_scan_rows);
|
||||
|
||||
void machine_start();
|
||||
void machine_reset();
|
||||
@ -157,9 +162,7 @@ public:
|
||||
DECLARE_VIDEO_START(xmultipl);
|
||||
DECLARE_VIDEO_START(hharry);
|
||||
DECLARE_VIDEO_START(rtype2);
|
||||
DECLARE_VIDEO_START(m82_common);
|
||||
DECLARE_VIDEO_START(m82_small);
|
||||
DECLARE_VIDEO_START(m82_large);
|
||||
DECLARE_VIDEO_START(m82);
|
||||
DECLARE_VIDEO_START(hharryu);
|
||||
DECLARE_VIDEO_START(poundfor);
|
||||
DECLARE_MACHINE_START(kengo);
|
||||
@ -184,7 +187,7 @@ public:
|
||||
|
||||
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
UINT32 screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
UINT32 screen_update_majtitle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
UINT32 screen_update_m82(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
inline void m72_m81_get_tile_info(tile_data &tileinfo,int tile_index,const UINT16 *vram,int gfxnum);
|
||||
inline void m82_m84_get_tile_info(tile_data &tileinfo,int tile_index,const UINT16 *vram,int gfxnum);
|
||||
void register_savestate();
|
||||
|
@ -170,12 +170,23 @@ VIDEO_START_MEMBER(m72_state,hharry)
|
||||
}
|
||||
|
||||
|
||||
// M82
|
||||
VIDEO_START_MEMBER(m72_state, m82_common)
|
||||
|
||||
|
||||
/* Major Title has a larger background RAM, and rowscroll */
|
||||
// the Air Duel conversion on the same PCB does not, is it jumper selectable, or a register, or a different RAM chip?
|
||||
TILEMAP_MAPPER_MEMBER(m72_state::m82_scan_rows)
|
||||
{
|
||||
/* logical (col,row) -> memory offset */
|
||||
return row*256 + col;
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(m72_state,m82)
|
||||
{
|
||||
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_fg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
|
||||
m_buffered_spriteram = auto_alloc_array(machine(), UINT16, m_spriteram.bytes()/2);
|
||||
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
// The tilemap can be 256x64, but seems to be used at 128x64 (scroll wraparound).
|
||||
// The layout ramains 256x64, the right half is just not displayed.
|
||||
m_bg_tilemap_large = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(m72_state::m82_scan_rows),this),8,8,128,64);
|
||||
|
||||
m_fg_tilemap->set_transmask(0,0xffff,0x0001);
|
||||
m_fg_tilemap->set_transmask(1,0x00ff,0xff01);
|
||||
@ -185,53 +196,28 @@ VIDEO_START_MEMBER(m72_state, m82_common)
|
||||
m_bg_tilemap->set_transmask(1,0x00ff,0xff00);
|
||||
m_bg_tilemap->set_transmask(2,0x0001,0xfffe);
|
||||
|
||||
memset(m_buffered_spriteram,0,m_spriteram.bytes());
|
||||
|
||||
|
||||
|
||||
register_savestate();
|
||||
save_item(NAME(m_majtitle_rowscroll));
|
||||
}
|
||||
|
||||
/* Major Title has a larger background RAM, and rowscroll */
|
||||
// the Air Duel conversion on the same PCB does not, is it jumper selectable, or a register, or a different RAM chip?
|
||||
TILEMAP_MAPPER_MEMBER(m72_state::majtitle_scan_rows)
|
||||
{
|
||||
/* logical (col,row) -> memory offset */
|
||||
return row*256 + col;
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(m72_state,m82_large)
|
||||
{
|
||||
// The tilemap can be 256x64, but seems to be used at 128x64 (scroll wraparound).
|
||||
// The layout ramains 256x64, the right half is just not displayed.
|
||||
// m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,256,64);
|
||||
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(m72_state::majtitle_scan_rows),this),8,8,128,64);
|
||||
|
||||
VIDEO_START_CALL_MEMBER(m82_common);
|
||||
m_bg_tilemap_large->set_transmask(0,0xffff,0x0000);
|
||||
m_bg_tilemap_large->set_transmask(1,0x00ff,0xff00);
|
||||
m_bg_tilemap_large->set_transmask(2,0x0001,0xfffe);
|
||||
|
||||
m_fg_tilemap->set_scrolldx(4,0);
|
||||
m_fg_tilemap->set_scrolldy(-128,-128);
|
||||
|
||||
m_bg_tilemap->set_scrolldx(4,0);
|
||||
m_bg_tilemap->set_scrolldy(-128,-128);
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(m72_state, m82_small)
|
||||
{
|
||||
// Air Duel expects the regular tilemap size
|
||||
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
|
||||
VIDEO_START_CALL_MEMBER(m82_common);
|
||||
|
||||
// why do the offsets also differ?
|
||||
m_fg_tilemap->set_scrolldx(4,3);
|
||||
m_fg_tilemap->set_scrolldy(-128,-128);
|
||||
|
||||
m_bg_tilemap->set_scrolldx(6-256,0);
|
||||
m_bg_tilemap->set_scrolldy(-128,-128);
|
||||
|
||||
m_bg_tilemap_large->set_scrolldx(4,0);
|
||||
m_bg_tilemap_large->set_scrolldy(-128,-128);
|
||||
|
||||
m_buffered_spriteram = auto_alloc_array(machine(), UINT16, m_spriteram.bytes()/2);
|
||||
memset(m_buffered_spriteram,0,m_spriteram.bytes());
|
||||
|
||||
register_savestate();
|
||||
save_item(NAME(m_m82_rowscroll));
|
||||
save_item(NAME(m_m82_tmcontrol));
|
||||
}
|
||||
|
||||
|
||||
// M84
|
||||
VIDEO_START_MEMBER(m72_state,rtype2)
|
||||
{
|
||||
@ -349,6 +335,11 @@ WRITE16_MEMBER(m72_state::videoram2_w)
|
||||
{
|
||||
COMBINE_DATA(&m_videoram2[offset]);
|
||||
m_bg_tilemap->mark_tile_dirty(offset/2);
|
||||
|
||||
// m82 has selectable tilemap size
|
||||
if (m_bg_tilemap_large)
|
||||
m_bg_tilemap_large->mark_tile_dirty(offset/2);
|
||||
|
||||
}
|
||||
|
||||
WRITE16_MEMBER(m72_state::irq_line_w)
|
||||
@ -432,13 +423,21 @@ WRITE16_MEMBER(m72_state::rtype2_port02_w)
|
||||
|
||||
|
||||
/* the following is mostly a kludge. This register seems to be used for something else */
|
||||
WRITE16_MEMBER(m72_state::majtitle_gfx_ctrl_w)
|
||||
WRITE16_MEMBER(m72_state::m82_gfx_ctrl_w)
|
||||
{
|
||||
if (ACCESSING_BITS_8_15)
|
||||
{
|
||||
if (data & 0xff00) m_majtitle_rowscroll = 1;
|
||||
else m_majtitle_rowscroll = 0;
|
||||
if (data & 0xff00) m_m82_rowscroll = 1;
|
||||
else m_m82_rowscroll = 0;
|
||||
}
|
||||
// printf("m82_gfx_ctrl_w %04x\n", data);
|
||||
|
||||
}
|
||||
|
||||
WRITE16_MEMBER(m72_state::m82_tm_ctrl_w)
|
||||
{
|
||||
COMBINE_DATA(&m_m82_tmcontrol);
|
||||
printf("tmcontrol %04x\n", m_m82_tmcontrol);
|
||||
}
|
||||
|
||||
|
||||
@ -585,10 +584,15 @@ UINT32 m72_state::screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap,
|
||||
}
|
||||
|
||||
|
||||
UINT32 m72_state::screen_update_majtitle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
UINT32 m72_state::screen_update_m82(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
int i;
|
||||
|
||||
tilemap_t* tm;
|
||||
|
||||
if (m_m82_tmcontrol & 0x40) tm = m_bg_tilemap_large;
|
||||
else tm = m_bg_tilemap;
|
||||
|
||||
|
||||
if (m_video_off)
|
||||
{
|
||||
@ -599,25 +603,25 @@ UINT32 m72_state::screen_update_majtitle(screen_device &screen, bitmap_ind16 &bi
|
||||
m_fg_tilemap->set_scrollx(0,m_scrollx1);
|
||||
m_fg_tilemap->set_scrolly(0,m_scrolly1);
|
||||
|
||||
if (m_majtitle_rowscroll)
|
||||
if (m_m82_rowscroll)
|
||||
{
|
||||
m_bg_tilemap->set_scroll_rows(512);
|
||||
tm->set_scroll_rows(512);
|
||||
for (i = 0;i < 512;i++)
|
||||
m_bg_tilemap->set_scrollx((i+m_scrolly2)&0x1ff,
|
||||
256 + m_majtitle_rowscrollram[i]);
|
||||
tm->set_scrollx((i+m_scrolly2)&0x1ff,
|
||||
256 + m_m82_rowscrollram[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bg_tilemap->set_scroll_rows(1);
|
||||
m_bg_tilemap->set_scrollx(0,256 + m_scrollx2);
|
||||
tm->set_scroll_rows(1);
|
||||
tm->set_scrollx(0,256 + m_scrollx2);
|
||||
}
|
||||
m_bg_tilemap->set_scrolly(0,m_scrolly2);
|
||||
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1,0);
|
||||
tm->set_scrolly(0,m_scrolly2);
|
||||
tm->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0);
|
||||
m_fg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1,0);
|
||||
majtitle_draw_sprites(bitmap,cliprect);
|
||||
draw_sprites(bitmap,cliprect);
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0,0);
|
||||
tm->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0);
|
||||
m_fg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0,0);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user