mirror of
https://github.com/holub/mame
synced 2025-06-08 13:53:52 +03:00
odyssey2: rename hash files to videopac and videopacp
This commit is contained in:
parent
5ed80089b0
commit
8cde9585e6
@ -4,8 +4,8 @@
|
|||||||
license:CC0
|
license:CC0
|
||||||
|
|
||||||
The softwarelist is sorted alphabetically per title, not counting clone sets.
|
The softwarelist is sorted alphabetically per title, not counting clone sets.
|
||||||
See g7400.xml for G7400 cartridges that can also be run on G7000/O2.
|
See videopacp.xml for G7400 cartridges that can also be run on G7000/O2.
|
||||||
When adding new sets, avoid naming conflicts between odyssey2.xml and g7400.xml.
|
When adding new sets, avoid naming conflicts between videopac.xml and videopacp.xml.
|
||||||
|
|
||||||
This list does not include ROM hacks, but those can still be loaded with -cart.
|
This list does not include ROM hacks, but those can still be loaded with -cart.
|
||||||
WIP beta homebrews are also not included.
|
WIP beta homebrews are also not included.
|
||||||
@ -136,7 +136,7 @@ Official VP+ upgaded versions (simply adds a background picture):
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<softwarelist name="odyssey2" description="Magnavox Odyssey 2 / Philips Videopac cartridges">
|
<softwarelist name="videopac" description="Philips Videopac / Magnavox Odyssey 2 cartridges">
|
||||||
|
|
||||||
<!-- Philips Videopac G7000/Magnavox Odyssey² carts -->
|
<!-- Philips Videopac G7000/Magnavox Odyssey² carts -->
|
||||||
|
|
@ -4,8 +4,8 @@
|
|||||||
license:CC0
|
license:CC0
|
||||||
|
|
||||||
The softwarelist is sorted alphabetically per title, not counting clone sets.
|
The softwarelist is sorted alphabetically per title, not counting clone sets.
|
||||||
When adding new sets, avoid naming conflicts between g7400.xml and odyssey2.xml,
|
When adding new sets, avoid naming conflicts between videopacp.xml and videopac.xml,
|
||||||
games that have prototypes or older sets in odyssey2.xml are marked "Plus" here.
|
games that have prototypes or older sets in videopac.xml are marked "Plus" here.
|
||||||
|
|
||||||
Most of these were normal Videopac G7000 carts with enhanced graphics for the
|
Most of these were normal Videopac G7000 carts with enhanced graphics for the
|
||||||
Videopac Plus G7400 and the unreleased Odyssey³ Command Center
|
Videopac Plus G7400 and the unreleased Odyssey³ Command Center
|
||||||
@ -39,7 +39,7 @@ Do Videopac+/Odyssey3 versions exist?:
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<softwarelist name="g7400" description="Philips Videopac+ cartridges">
|
<softwarelist name="videopacp" description="Philips Videopac+ cartridges">
|
||||||
|
|
||||||
<!-- Philips Videopac+ G7400 carts, compatible on G7000 -->
|
<!-- Philips Videopac+ G7400 carts, compatible on G7000 -->
|
||||||
|
|
@ -65,7 +65,7 @@ TODO:
|
|||||||
- ppp(the tetris game) does not work properly on PAL, is this homebrew NTSC-only,
|
- ppp(the tetris game) does not work properly on PAL, is this homebrew NTSC-only,
|
||||||
or is PAL detection going wrong? It does look like PAL/NTSC detection is working,
|
or is PAL detection going wrong? It does look like PAL/NTSC detection is working,
|
||||||
see internal RAM $3D d7. So maybe it is due to inaccurate PAL video timing.
|
see internal RAM $3D d7. So maybe it is due to inaccurate PAL video timing.
|
||||||
The game does mid-scanline updates.
|
The game does mid-scanline video updates.
|
||||||
- g7400 probably has different video timing too (not same as g7000)
|
- g7400 probably has different video timing too (not same as g7000)
|
||||||
- g7400 helicopt sometimes locks up at the sea level, timing related?
|
- g7400 helicopt sometimes locks up at the sea level, timing related?
|
||||||
- 4in1 and musician are not supposed to work on g7400, but work fine on MAME,
|
- 4in1 and musician are not supposed to work on g7400, but work fine on MAME,
|
||||||
@ -160,10 +160,10 @@ private:
|
|||||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
};
|
};
|
||||||
|
|
||||||
class g7400_state : public odyssey2_state
|
class videopacp_state : public odyssey2_state
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
g7400_state(const machine_config &mconfig, device_type type, const char *tag) :
|
videopacp_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||||
odyssey2_state(mconfig, type, tag),
|
odyssey2_state(mconfig, type, tag),
|
||||||
m_i8243(*this, "i8243"),
|
m_i8243(*this, "i8243"),
|
||||||
m_ef934x(*this, "ef934x")
|
m_ef934x(*this, "ef934x")
|
||||||
@ -207,7 +207,7 @@ void odyssey2_state::machine_start()
|
|||||||
save_item(NAME(m_p2));
|
save_item(NAME(m_p2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void g7400_state::machine_start()
|
void videopacp_state::machine_start()
|
||||||
{
|
{
|
||||||
odyssey2_state::machine_start();
|
odyssey2_state::machine_start();
|
||||||
memset(m_ef934x_extram, 0, sizeof(m_ef934x_extram));
|
memset(m_ef934x_extram, 0, sizeof(m_ef934x_extram));
|
||||||
@ -266,7 +266,7 @@ uint32_t odyssey2_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t g7400_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
uint32_t videopacp_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
u8 lum = ~m_p1 >> 4 & 0x08;
|
u8 lum = ~m_p1 >> 4 & 0x08;
|
||||||
bitmap_ind16 *ef934x_bitmap = m_ef934x->get_bitmap();
|
bitmap_ind16 *ef934x_bitmap = m_ef934x->get_bitmap();
|
||||||
@ -395,19 +395,19 @@ READ_LINE_MEMBER(odyssey2_state::t1_read)
|
|||||||
|
|
||||||
// G7400-specific
|
// G7400-specific
|
||||||
|
|
||||||
uint8_t g7400_state::io_read(offs_t offset)
|
uint8_t videopacp_state::io_read(offs_t offset)
|
||||||
{
|
{
|
||||||
u8 data = odyssey2_state::io_read(offset);
|
u8 data = odyssey2_state::io_read(offset);
|
||||||
return io_vpp(offset, data);
|
return io_vpp(offset, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void g7400_state::io_write(offs_t offset, uint8_t data)
|
void videopacp_state::io_write(offs_t offset, uint8_t data)
|
||||||
{
|
{
|
||||||
odyssey2_state::io_write(offset, data);
|
odyssey2_state::io_write(offset, data);
|
||||||
io_vpp(offset, data);
|
io_vpp(offset, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t g7400_state::io_vpp(offs_t offset, uint8_t data)
|
uint8_t videopacp_state::io_vpp(offs_t offset, uint8_t data)
|
||||||
{
|
{
|
||||||
if (!(m_p1 & 0x20))
|
if (!(m_p1 & 0x20))
|
||||||
{
|
{
|
||||||
@ -421,14 +421,14 @@ uint8_t g7400_state::io_vpp(offs_t offset, uint8_t data)
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void g7400_state::p2_write(uint8_t data)
|
void videopacp_state::p2_write(uint8_t data)
|
||||||
{
|
{
|
||||||
odyssey2_state::p2_write(data);
|
odyssey2_state::p2_write(data);
|
||||||
m_i8243->p2_w(m_p2 & 0x0f);
|
m_i8243->p2_w(m_p2 & 0x0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<int P>
|
template<int P>
|
||||||
void g7400_state::i8243_port_w(uint8_t data)
|
void videopacp_state::i8243_port_w(uint8_t data)
|
||||||
{
|
{
|
||||||
// P4,P5: color mix I8244 side (IC674)
|
// P4,P5: color mix I8244 side (IC674)
|
||||||
// P6,P7: color mix EF9340 side (IC678)
|
// P6,P7: color mix EF9340 side (IC678)
|
||||||
@ -450,7 +450,7 @@ void g7400_state::i8243_port_w(uint8_t data)
|
|||||||
|
|
||||||
// EF9341 extended RAM
|
// EF9341 extended RAM
|
||||||
|
|
||||||
offs_t g7400_state::ef934x_extram_address(offs_t offset)
|
offs_t videopacp_state::ef934x_extram_address(offs_t offset)
|
||||||
{
|
{
|
||||||
u8 latch = (offset >> 12 & 0x80) | (offset >> 4 & 0x7f);
|
u8 latch = (offset >> 12 & 0x80) | (offset >> 4 & 0x7f);
|
||||||
u16 address = (latch & 0x1f) | (offset << 9 & 0x200) | (latch << 3 & 0x400);
|
u16 address = (latch & 0x1f) | (offset << 9 & 0x200) | (latch << 3 & 0x400);
|
||||||
@ -461,12 +461,12 @@ offs_t g7400_state::ef934x_extram_address(offs_t offset)
|
|||||||
return address | (offset << 4 & 0x60) | (latch << 2 & 0x180);
|
return address | (offset << 4 & 0x60) | (latch << 2 & 0x180);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t g7400_state::ef934x_extram_r(offs_t offset)
|
uint8_t videopacp_state::ef934x_extram_r(offs_t offset)
|
||||||
{
|
{
|
||||||
return m_ef934x_extram[ef934x_extram_address(offset)];
|
return m_ef934x_extram[ef934x_extram_address(offset)];
|
||||||
}
|
}
|
||||||
|
|
||||||
void g7400_state::ef934x_extram_w(offs_t offset, uint8_t data)
|
void videopacp_state::ef934x_extram_w(offs_t offset, uint8_t data)
|
||||||
{
|
{
|
||||||
m_ef934x_extram[ef934x_extram_address(offset)] = data;
|
m_ef934x_extram[ef934x_extram_address(offset)] = data;
|
||||||
}
|
}
|
||||||
@ -694,8 +694,8 @@ void odyssey2_state::odyssey2(machine_config &config)
|
|||||||
|
|
||||||
/* cartridge */
|
/* cartridge */
|
||||||
O2_CART_SLOT(config, m_cart, o2_cart, nullptr);
|
O2_CART_SLOT(config, m_cart, o2_cart, nullptr);
|
||||||
SOFTWARE_LIST(config, "cart_list").set_original("odyssey2").set_filter("O2");
|
SOFTWARE_LIST(config, "cart_list").set_original("videopac").set_filter("O2");
|
||||||
SOFTWARE_LIST(config, "g7400_list").set_compatible("g7400").set_filter("O2");
|
SOFTWARE_LIST(config, "vpp_list").set_compatible("videopacp").set_filter("O2");
|
||||||
}
|
}
|
||||||
|
|
||||||
void odyssey2_state::videopac(machine_config &config)
|
void odyssey2_state::videopac(machine_config &config)
|
||||||
@ -712,7 +712,7 @@ void odyssey2_state::videopac(machine_config &config)
|
|||||||
m_maincpu->set_clock(17.734476_MHz_XTAL / 3);
|
m_maincpu->set_clock(17.734476_MHz_XTAL / 3);
|
||||||
|
|
||||||
subdevice<software_list_device>("cart_list")->set_filter("VP");
|
subdevice<software_list_device>("cart_list")->set_filter("VP");
|
||||||
subdevice<software_list_device>("g7400_list")->set_filter("VP");
|
subdevice<software_list_device>("vpp_list")->set_filter("VP");
|
||||||
}
|
}
|
||||||
|
|
||||||
void odyssey2_state::videopacf(machine_config &config)
|
void odyssey2_state::videopacf(machine_config &config)
|
||||||
@ -725,38 +725,38 @@ void odyssey2_state::videopacf(machine_config &config)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void g7400_state::g7400(machine_config &config)
|
void videopacp_state::g7400(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
I8048(config, m_maincpu, 5.911_MHz_XTAL);
|
I8048(config, m_maincpu, 5.911_MHz_XTAL);
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &g7400_state::odyssey2_mem);
|
m_maincpu->set_addrmap(AS_PROGRAM, &videopacp_state::odyssey2_mem);
|
||||||
m_maincpu->set_addrmap(AS_IO, &g7400_state::odyssey2_io);
|
m_maincpu->set_addrmap(AS_IO, &videopacp_state::odyssey2_io);
|
||||||
m_maincpu->p1_out_cb().set(FUNC(g7400_state::p1_write));
|
m_maincpu->p1_out_cb().set(FUNC(videopacp_state::p1_write));
|
||||||
m_maincpu->p2_in_cb().set(FUNC(g7400_state::p2_read));
|
m_maincpu->p2_in_cb().set(FUNC(videopacp_state::p2_read));
|
||||||
m_maincpu->p2_out_cb().set(FUNC(g7400_state::p2_write));
|
m_maincpu->p2_out_cb().set(FUNC(videopacp_state::p2_write));
|
||||||
m_maincpu->bus_in_cb().set(FUNC(g7400_state::bus_read));
|
m_maincpu->bus_in_cb().set(FUNC(videopacp_state::bus_read));
|
||||||
m_maincpu->t0_in_cb().set("cartslot", FUNC(o2_cart_slot_device::t0_read));
|
m_maincpu->t0_in_cb().set("cartslot", FUNC(o2_cart_slot_device::t0_read));
|
||||||
m_maincpu->t1_in_cb().set(FUNC(g7400_state::t1_read));
|
m_maincpu->t1_in_cb().set(FUNC(videopacp_state::t1_read));
|
||||||
m_maincpu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w));
|
m_maincpu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w));
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||||
m_screen->set_screen_update(FUNC(g7400_state::screen_update));
|
m_screen->set_screen_update(FUNC(videopacp_state::screen_update));
|
||||||
m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
|
m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
|
||||||
m_screen->set_palette("palette");
|
m_screen->set_palette("palette");
|
||||||
|
|
||||||
PALETTE(config, "palette", m_i8244, FUNC(i8244_device::i8244_palette), 16);
|
PALETTE(config, "palette", m_i8244, FUNC(i8244_device::i8244_palette), 16);
|
||||||
|
|
||||||
I8243(config, m_i8243);
|
I8243(config, m_i8243);
|
||||||
m_i8243->p4_out_cb().set(FUNC(g7400_state::i8243_port_w<0>));
|
m_i8243->p4_out_cb().set(FUNC(videopacp_state::i8243_port_w<0>));
|
||||||
m_i8243->p5_out_cb().set(FUNC(g7400_state::i8243_port_w<1>));
|
m_i8243->p5_out_cb().set(FUNC(videopacp_state::i8243_port_w<1>));
|
||||||
m_i8243->p6_out_cb().set(FUNC(g7400_state::i8243_port_w<2>));
|
m_i8243->p6_out_cb().set(FUNC(videopacp_state::i8243_port_w<2>));
|
||||||
m_i8243->p7_out_cb().set(FUNC(g7400_state::i8243_port_w<3>));
|
m_i8243->p7_out_cb().set(FUNC(videopacp_state::i8243_port_w<3>));
|
||||||
|
|
||||||
EF9340_1(config, m_ef934x, (8.867_MHz_XTAL * 2) / 5, "screen");
|
EF9340_1(config, m_ef934x, (8.867_MHz_XTAL * 2) / 5, "screen");
|
||||||
m_ef934x->set_offsets(15, 5);
|
m_ef934x->set_offsets(15, 5);
|
||||||
m_ef934x->read_exram().set(FUNC(g7400_state::ef934x_extram_r));
|
m_ef934x->read_exram().set(FUNC(videopacp_state::ef934x_extram_r));
|
||||||
m_ef934x->write_exram().set(FUNC(g7400_state::ef934x_extram_w));
|
m_ef934x->write_exram().set(FUNC(videopacp_state::ef934x_extram_w));
|
||||||
|
|
||||||
I8245(config, m_i8244, (8.867_MHz_XTAL * 2) / 5);
|
I8245(config, m_i8244, (8.867_MHz_XTAL * 2) / 5);
|
||||||
m_i8244->set_screen("screen");
|
m_i8244->set_screen("screen");
|
||||||
@ -768,11 +768,11 @@ void g7400_state::g7400(machine_config &config)
|
|||||||
|
|
||||||
/* cartridge */
|
/* cartridge */
|
||||||
O2_CART_SLOT(config, m_cart, o2_cart, nullptr);
|
O2_CART_SLOT(config, m_cart, o2_cart, nullptr);
|
||||||
SOFTWARE_LIST(config, "cart_list").set_original("g7400").set_filter("VPP");
|
SOFTWARE_LIST(config, "cart_list").set_original("videopacp").set_filter("VPP");
|
||||||
SOFTWARE_LIST(config, "ody2_list").set_compatible("odyssey2").set_filter("VPP");
|
SOFTWARE_LIST(config, "vp_list").set_compatible("videopac").set_filter("VPP");
|
||||||
}
|
}
|
||||||
|
|
||||||
void g7400_state::jo7400(machine_config &config)
|
void videopacp_state::jo7400(machine_config &config)
|
||||||
{
|
{
|
||||||
g7400(config);
|
g7400(config);
|
||||||
|
|
||||||
@ -781,7 +781,7 @@ void g7400_state::jo7400(machine_config &config)
|
|||||||
m_ef934x->set_clock(3.5625_MHz_XTAL);
|
m_ef934x->set_clock(3.5625_MHz_XTAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void g7400_state::odyssey3(machine_config &config)
|
void videopacp_state::odyssey3(machine_config &config)
|
||||||
{
|
{
|
||||||
g7400(config);
|
g7400(config);
|
||||||
|
|
||||||
@ -801,7 +801,7 @@ void g7400_state::odyssey3(machine_config &config)
|
|||||||
PALETTE(config.replace(), "palette", FUNC(odyssey2_state::odyssey2_palette), 16);
|
PALETTE(config.replace(), "palette", FUNC(odyssey2_state::odyssey2_palette), 16);
|
||||||
|
|
||||||
subdevice<software_list_device>("cart_list")->set_filter("O3");
|
subdevice<software_list_device>("cart_list")->set_filter("O3");
|
||||||
subdevice<software_list_device>("ody2_list")->set_filter("O3");
|
subdevice<software_list_device>("vp_list")->set_filter("O3");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -826,7 +826,7 @@ ROM_START (videopacf)
|
|||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
|
||||||
ROM_START (g7400)
|
ROM_START (videopacp)
|
||||||
ROM_REGION(0x0400,"maincpu",0)
|
ROM_REGION(0x0400,"maincpu",0)
|
||||||
ROM_LOAD ("g7400.bin", 0x0000, 0x0400, CRC(e20a9f41) SHA1(5130243429b40b01a14e1304d0394b8459a6fbae))
|
ROM_LOAD ("g7400.bin", 0x0000, 0x0400, CRC(e20a9f41) SHA1(5130243429b40b01a14e1304d0394b8459a6fbae))
|
||||||
ROM_END
|
ROM_END
|
||||||
@ -854,6 +854,6 @@ COMP( 1979, odyssey2, 0, 0, odyssey2, odyssey2, odyssey2_state, empty_i
|
|||||||
COMP( 1978, videopac, odyssey2, 0, videopac, odyssey2, odyssey2_state, empty_init, "Philips", "Videopac G7000 (Europe)", MACHINE_SUPPORTS_SAVE )
|
COMP( 1978, videopac, odyssey2, 0, videopac, odyssey2, odyssey2_state, empty_init, "Philips", "Videopac G7000 (Europe)", MACHINE_SUPPORTS_SAVE )
|
||||||
COMP( 1979, videopacf, odyssey2, 0, videopacf, odyssey2, odyssey2_state, empty_init, "Philips", "Videopac C52 (France)", MACHINE_SUPPORTS_SAVE )
|
COMP( 1979, videopacf, odyssey2, 0, videopacf, odyssey2, odyssey2_state, empty_init, "Philips", "Videopac C52 (France)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
|
||||||
COMP( 1983, g7400, 0, 0, g7400, g7400, g7400_state, empty_init, "Philips", "Videopac+ G7400 (Europe)", MACHINE_SUPPORTS_SAVE )
|
COMP( 1983, videopacp, 0, 0, g7400, g7400, videopacp_state, empty_init, "Philips", "Videopac+ G7400 (Europe)", MACHINE_SUPPORTS_SAVE )
|
||||||
COMP( 1983, jopac, g7400, 0, jo7400, g7400, g7400_state, empty_init, "Philips (Brandt license)", "Jopac JO7400 (France)", MACHINE_SUPPORTS_SAVE )
|
COMP( 1983, jopac, videopacp, 0, jo7400, g7400, videopacp_state, empty_init, "Philips (Brandt license)", "Jopac JO7400 (France)", MACHINE_SUPPORTS_SAVE )
|
||||||
COMP( 1983, odyssey3, g7400, 0, odyssey3, g7400, g7400_state, empty_init, "Magnavox", "Odyssey 3 Command Center (US, prototype)", MACHINE_SUPPORTS_SAVE )
|
COMP( 1983, odyssey3, videopacp, 0, odyssey3, g7400, videopacp_state, empty_init, "Magnavox", "Odyssey 3 Command Center (US, prototype)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
@ -32589,12 +32589,12 @@ octopus //
|
|||||||
odyssey // (c) Silicon Gaming.
|
odyssey // (c) Silicon Gaming.
|
||||||
|
|
||||||
@source:odyssey2.cpp
|
@source:odyssey2.cpp
|
||||||
g7400 // 1983 Videopac Plus G7400
|
|
||||||
jopac // 1983 Jopac JO7400
|
jopac // 1983 Jopac JO7400
|
||||||
odyssey2 // Magnavox Odyssey 2 - 1978-1983
|
odyssey2 // Magnavox Odyssey 2 - 1978-1983
|
||||||
odyssey3 // Magnavox Odyssey 3 / Command Center (prototype)
|
odyssey3 // Magnavox Odyssey 3 / Command Center (prototype)
|
||||||
videopac // 1979 Videopac G7000
|
videopac // 1979 Videopac G7000
|
||||||
videopacf // 1979 Videopac C52
|
videopacf // 1979 Videopac C52
|
||||||
|
videopacp // 1983 Videopac Plus G7400
|
||||||
|
|
||||||
@source:offtwall.cpp
|
@source:offtwall.cpp
|
||||||
offtwall // 136090 (c) 1991
|
offtwall // 136090 (c) 1991
|
||||||
|
Loading…
Reference in New Issue
Block a user