mirror of
https://github.com/holub/mame
synced 2025-04-16 05:24:54 +03:00
New machines marked as NOT_WORKING
---------------------------------- Gun Shot [Museo del Recreativo] - blktiger.cpp: used finders and some other small cleanups
This commit is contained in:
parent
1a7552a152
commit
18bdf245a2
@ -1528,8 +1528,6 @@ files {
|
||||
MAME_DIR .. "src/mame/video/tigeroad_spr.cpp",
|
||||
MAME_DIR .. "src/mame/video/tigeroad_spr.h",
|
||||
MAME_DIR .. "src/mame/drivers/blktiger.cpp",
|
||||
MAME_DIR .. "src/mame/includes/blktiger.h",
|
||||
MAME_DIR .. "src/mame/video/blktiger.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/blktiger_ms.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/cbasebal.cpp",
|
||||
MAME_DIR .. "src/mame/includes/cbasebal.h",
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -31,6 +31,7 @@ Status:
|
||||
ToDo:
|
||||
- The "new cpu" machines are lacking mechanical sounds. The output bits vary per game.
|
||||
- La Rana: playable. Needs its own layout. Inputs to be figured out.
|
||||
- Gun Shot: needs device-ification and sharing of the sound board emulated in spinb.cpp.
|
||||
|
||||
********************************************************************************************************/
|
||||
|
||||
@ -73,6 +74,7 @@ public:
|
||||
void inder(machine_config &config);
|
||||
void brvteam(machine_config &config);
|
||||
void canasta(machine_config &config);
|
||||
void gunshot(machine_config &config);
|
||||
void lapbylap(machine_config &config);
|
||||
|
||||
void init_0();
|
||||
@ -1641,6 +1643,34 @@ ROM_START(larana)
|
||||
ROM_LOAD("inder_sa_mod_la_rana_b_200690.bin", 0x00000, 0x10000, CRC(3aaa7c7d) SHA1(4a8531b6859fc1f2a4bb63a51da35e9081b7e88b))
|
||||
ROM_END
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
/ Gun Shot (199?)
|
||||
/ Main PCB: Inder SA UCPU87 (only 3 of 4 I8255 sockets populated)
|
||||
/ Sound PCB: unmarked (only 1 of 2 ROM sockets populated)
|
||||
/-------------------------------------------------------------------*/
|
||||
ROM_START(gunshot)
|
||||
ROM_REGION(0x4000, "maincpu", 0)
|
||||
ROM_LOAD("m-177_gun_shot_rom_0_version_0.4.ci3", 0x0000, 0x4000, CRC(f0f4e01e) SHA1(27b28ce3a81e01d9c1bacebe078c135e24b637a7)) // 001xxxxxxxxxxxxx = 0xFF
|
||||
ROM_CONTINUE( 0x0000, 0x4000)
|
||||
ROM_CONTINUE( 0x0000, 0x4000)
|
||||
ROM_CONTINUE( 0x0000, 0x4000)
|
||||
// second ROM socket empty
|
||||
|
||||
ROM_REGION(0x2000, "audiocpu", 0)
|
||||
ROM_LOAD("m-177_gun_shot_rom_1_version_0.0.ic9", 0x0000, 0x2000, CRC(737ea656) SHA1(0bb16ae4bef2800681aaa7741506f40a337e6af0)) // 000111xxxxxxxxxx = 0xFF
|
||||
ROM_CONTINUE( 0x0000, 0x2000)
|
||||
ROM_CONTINUE( 0x0000, 0x2000)
|
||||
ROM_CONTINUE( 0x0000, 0x2000)
|
||||
ROM_CONTINUE( 0x0000, 0x2000)
|
||||
ROM_CONTINUE( 0x0000, 0x2000)
|
||||
ROM_CONTINUE( 0x0000, 0x2000)
|
||||
ROM_CONTINUE( 0x0000, 0x2000)
|
||||
|
||||
ROM_REGION(0x80000, "audiorom", 0)
|
||||
ROM_LOAD("m-177_gun_shot_rom_2_version_0.0.ic16", 0x00000, 0x80000, CRC(f91ddd0c) SHA1(cc4e1440e76330872f512d56376f45b92a8dbee6))
|
||||
// second ROM socket empty
|
||||
ROM_END
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
/ 250 CC (1992)
|
||||
/-------------------------------------------------------------------*/
|
||||
@ -1671,10 +1701,13 @@ GAME(1986, canasta, 0, canasta, canasta, inder_state, empty_init, ROT0, "In
|
||||
GAME(1986, lapbylap, 0, lapbylap, lapbylap, inder_state, empty_init, ROT0, "Inder", "Lap By Lap", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
|
||||
// new cpu board, sound board with msm5205
|
||||
GAME(1987, pinmoonl, 0, inder, pinmoonl, inder_state, init_0, ROT0, "Inder", "Moon Light (Inder)", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1988, pinclown, 0, inder, pinclown, inder_state, init_1, ROT0, "Inder", "Clown (Inder)", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1989, corsario, 0, inder, corsario, inder_state, init_1, ROT0, "Inder", "Corsario", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1990, mundial, 0, inder, mundial, inder_state, init_1, ROT0, "Inder", "Mundial 90", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1991, atleta, 0, inder, atleta, inder_state, init_1, ROT0, "Inder", "Atleta", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1991, larana, 0, inder, larana, inder_state, init_0, ROT0, "Inder", "La Rana", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1992, ind250cc, 0, inder, ind250cc, inder_state, init_1, ROT0, "Inder", "250 CC", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1987, pinmoonl, 0, inder, pinmoonl, inder_state, init_0, ROT0, "Inder", " Moon Light (Inder)", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1988, pinclown, 0, inder, pinclown, inder_state, init_1, ROT0, "Inder", "Clown (Inder)", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1989, corsario, 0, inder, corsario, inder_state, init_1, ROT0, "Inder", "Corsario", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1990, mundial, 0, inder, mundial, inder_state, init_1, ROT0, "Inder", "Mundial 90", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1991, atleta, 0, inder, atleta, inder_state, init_1, ROT0, "Inder", "Atleta", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1991, larana, 0, inder, larana, inder_state, init_0, ROT0, "Inder", "La Rana", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
GAME(1992, ind250cc, 0, inder, ind250cc, inder_state, init_1, ROT0, "Inder", "250 CC", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
|
||||
// new cpu board, sound board with msm6585 (like the ones in spinb.cpp)
|
||||
GAME(199?, gunshot, 0, inder, larana, inder_state, init_0, ROT0, "Spinball", "Gun Shot", MACHINE_IS_SKELETON_MECHANICAL )
|
||||
|
@ -1,95 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Paul Leaman
|
||||
/***************************************************************************
|
||||
|
||||
Black Tiger
|
||||
|
||||
***************************************************************************/
|
||||
#ifndef MAME_INCLUDES_BLKTIGER_H
|
||||
#define MAME_INCLUDES_BLKTIGER_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpu/mcs51/mcs51.h"
|
||||
#include "video/bufsprite.h"
|
||||
#include "emupal.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class blktiger_state : public driver_device
|
||||
{
|
||||
public:
|
||||
blktiger_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_txvideoram(*this, "txvideoram"),
|
||||
m_mcu(*this, "mcu"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void init_blktigerb3();
|
||||
void blktiger(machine_config &config);
|
||||
void blktigerbl(machine_config &config);
|
||||
|
||||
private:
|
||||
/* memory pointers */
|
||||
required_device<buffered_spriteram8_device> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_txvideoram;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *m_tx_tilemap = nullptr;
|
||||
tilemap_t *m_bg_tilemap8x4 = nullptr;
|
||||
tilemap_t *m_bg_tilemap4x8 = nullptr;
|
||||
uint32_t m_scroll_bank = 0U;
|
||||
uint8_t m_scroll_x[2]{};
|
||||
uint8_t m_scroll_y[2]{};
|
||||
std::unique_ptr<uint8_t[]> m_scroll_ram{};
|
||||
uint8_t m_screen_layout = 0U;
|
||||
uint8_t m_chon = 0U;
|
||||
uint8_t m_objon = 0U;
|
||||
uint8_t m_bgon = 0U;
|
||||
|
||||
/* mcu-related */
|
||||
uint8_t m_z80_latch = 0U;
|
||||
uint8_t m_i8751_latch = 0U;
|
||||
|
||||
/* devices */
|
||||
optional_device<i8751_device> m_mcu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
uint8_t blktiger_from_mcu_r();
|
||||
void blktiger_to_mcu_w(uint8_t data);
|
||||
uint8_t blktiger_from_main_r();
|
||||
void blktiger_to_main_w(uint8_t data);
|
||||
void blktiger_bankswitch_w(uint8_t data);
|
||||
void blktiger_coinlockout_w(uint8_t data);
|
||||
void blktiger_txvideoram_w(offs_t offset, uint8_t data);
|
||||
uint8_t blktiger_bgvideoram_r(offs_t offset);
|
||||
void blktiger_bgvideoram_w(offs_t offset, uint8_t data);
|
||||
void blktiger_bgvideoram_bank_w(uint8_t data);
|
||||
void blktiger_scrolly_w(offs_t offset, uint8_t data);
|
||||
void blktiger_scrollx_w(offs_t offset, uint8_t data);
|
||||
void blktiger_video_control_w(uint8_t data);
|
||||
void blktiger_video_enable_w(uint8_t data);
|
||||
void blktiger_screen_layout_w(uint8_t data);
|
||||
TILEMAP_MAPPER_MEMBER(bg8x4_scan);
|
||||
TILEMAP_MAPPER_MEMBER(bg4x8_scan);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_tx_tile_info);
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
uint32_t screen_update_blktiger(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
void blktiger_io_map(address_map &map);
|
||||
void blktiger_map(address_map &map);
|
||||
void blktiger_sound_map(address_map &map);
|
||||
void blktigerbl_io_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_BLKTIGER_H
|
@ -17325,6 +17325,7 @@ atleta //
|
||||
brvteam //
|
||||
canasta //
|
||||
corsario //
|
||||
gunshot //
|
||||
ind250cc //
|
||||
lapbylap //
|
||||
larana //
|
||||
|
@ -1,238 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Paul Leaman
|
||||
#include "emu.h"
|
||||
#include "includes/blktiger.h"
|
||||
|
||||
|
||||
#define BGRAM_BANK_SIZE 0x1000
|
||||
#define BGRAM_BANKS 4
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Callbacks for the TileMap code
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
TILEMAP_MAPPER_MEMBER(blktiger_state::bg8x4_scan)
|
||||
{
|
||||
/* logical (col,row) -> memory offset */
|
||||
return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x70) << 4) + ((row & 0x30) << 7);
|
||||
}
|
||||
|
||||
TILEMAP_MAPPER_MEMBER(blktiger_state::bg4x8_scan)
|
||||
{
|
||||
/* logical (col,row) -> memory offset */
|
||||
return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x30) << 4) + ((row & 0x70) << 6);
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(blktiger_state::get_bg_tile_info)
|
||||
{
|
||||
/* the tile priority table is a guess compiled by looking at the game. It
|
||||
was not derived from a PROM so it could be wrong. */
|
||||
static const uint8_t split_table[16] =
|
||||
{
|
||||
3,3,2,2,
|
||||
1,1,0,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0
|
||||
};
|
||||
uint8_t attr = m_scroll_ram[2 * tile_index + 1];
|
||||
int color = (attr & 0x78) >> 3;
|
||||
tileinfo.set(1,
|
||||
m_scroll_ram[2 * tile_index] + ((attr & 0x07) << 8),
|
||||
color,
|
||||
(attr & 0x80) ? TILE_FLIPX : 0);
|
||||
tileinfo.group = split_table[color];
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(blktiger_state::get_tx_tile_info)
|
||||
{
|
||||
uint8_t attr = m_txvideoram[tile_index + 0x400];
|
||||
tileinfo.set(0,
|
||||
m_txvideoram[tile_index] + ((attr & 0xe0) << 3),
|
||||
attr & 0x1f,
|
||||
0);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Start the video hardware emulation.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void blktiger_state::video_start()
|
||||
{
|
||||
m_chon = 1;
|
||||
m_bgon = 1;
|
||||
m_objon = 1;
|
||||
m_screen_layout = 0;
|
||||
|
||||
m_scroll_ram = std::make_unique<uint8_t[]>(BGRAM_BANK_SIZE * BGRAM_BANKS);
|
||||
|
||||
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(blktiger_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
m_bg_tilemap8x4 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(blktiger_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(blktiger_state::bg8x4_scan)), 16, 16, 128, 64);
|
||||
m_bg_tilemap4x8 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(blktiger_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(blktiger_state::bg4x8_scan)), 16, 16, 64, 128);
|
||||
|
||||
m_tx_tilemap->set_transparent_pen(3);
|
||||
|
||||
m_bg_tilemap8x4->set_transmask(0, 0xffff, 0x8000); /* split type 0 is totally transparent in front half */
|
||||
m_bg_tilemap8x4->set_transmask(1, 0xfff0, 0x800f); /* split type 1 has pens 4-15 transparent in front half */
|
||||
m_bg_tilemap8x4->set_transmask(2, 0xff00, 0x80ff); /* split type 1 has pens 8-15 transparent in front half */
|
||||
m_bg_tilemap8x4->set_transmask(3, 0xf000, 0x8fff); /* split type 1 has pens 12-15 transparent in front half */
|
||||
m_bg_tilemap4x8->set_transmask(0, 0xffff, 0x8000);
|
||||
m_bg_tilemap4x8->set_transmask(1, 0xfff0, 0x800f);
|
||||
m_bg_tilemap4x8->set_transmask(2, 0xff00, 0x80ff);
|
||||
m_bg_tilemap4x8->set_transmask(3, 0xf000, 0x8fff);
|
||||
|
||||
m_tx_tilemap->set_scrolldx(128, 128);
|
||||
m_tx_tilemap->set_scrolldy( 6, 6);
|
||||
m_bg_tilemap8x4->set_scrolldx(128, 128);
|
||||
m_bg_tilemap8x4->set_scrolldy( 6, 6);
|
||||
m_bg_tilemap4x8->set_scrolldx(128, 128);
|
||||
m_bg_tilemap4x8->set_scrolldy( 6, 6);
|
||||
|
||||
save_pointer(NAME(m_scroll_ram), BGRAM_BANK_SIZE * BGRAM_BANKS);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Memory handlers
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void blktiger_state::blktiger_txvideoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_txvideoram[offset] = data;
|
||||
m_tx_tilemap->mark_tile_dirty(offset & 0x3ff);
|
||||
}
|
||||
|
||||
uint8_t blktiger_state::blktiger_bgvideoram_r(offs_t offset)
|
||||
{
|
||||
return m_scroll_ram[offset + m_scroll_bank];
|
||||
}
|
||||
|
||||
void blktiger_state::blktiger_bgvideoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
offset += m_scroll_bank;
|
||||
|
||||
m_scroll_ram[offset] = data;
|
||||
m_bg_tilemap8x4->mark_tile_dirty(offset / 2);
|
||||
m_bg_tilemap4x8->mark_tile_dirty(offset / 2);
|
||||
}
|
||||
|
||||
void blktiger_state::blktiger_bgvideoram_bank_w(uint8_t data)
|
||||
{
|
||||
m_scroll_bank = (data % BGRAM_BANKS) * BGRAM_BANK_SIZE;
|
||||
}
|
||||
|
||||
|
||||
void blktiger_state::blktiger_scrolly_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_scroll_y[offset] = data;
|
||||
int scrolly = m_scroll_y[0] | (m_scroll_y[1] << 8);
|
||||
m_bg_tilemap8x4->set_scrolly(0, scrolly);
|
||||
m_bg_tilemap4x8->set_scrolly(0, scrolly);
|
||||
}
|
||||
|
||||
void blktiger_state::blktiger_scrollx_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_scroll_x[offset] = data;
|
||||
int scrollx = m_scroll_x[0] | (m_scroll_x[1] << 8);
|
||||
m_bg_tilemap8x4->set_scrollx(0, scrollx);
|
||||
m_bg_tilemap4x8->set_scrollx(0, scrollx);
|
||||
}
|
||||
|
||||
|
||||
void blktiger_state::blktiger_video_control_w(uint8_t data)
|
||||
{
|
||||
/* bits 0 and 1 are coin counters */
|
||||
machine().bookkeeping().coin_counter_w(0,data & 1);
|
||||
machine().bookkeeping().coin_counter_w(1,data & 2);
|
||||
|
||||
/* bit 5 resets the sound CPU */
|
||||
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x20) ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
/* bit 6 flips screen */
|
||||
flip_screen_set(data & 0x40);
|
||||
|
||||
/* bit 7 enables characters? Just a guess */
|
||||
m_chon = ~data & 0x80;
|
||||
}
|
||||
|
||||
void blktiger_state::blktiger_video_enable_w(uint8_t data)
|
||||
{
|
||||
/* not sure which is which, but I think that bit 1 and 2 enable background and sprites */
|
||||
/* bit 1 enables bg ? */
|
||||
m_bgon = ~data & 0x02;
|
||||
|
||||
/* bit 2 enables sprites ? */
|
||||
m_objon = ~data & 0x04;
|
||||
}
|
||||
|
||||
void blktiger_state::blktiger_screen_layout_w(uint8_t data)
|
||||
{
|
||||
m_screen_layout = data;
|
||||
m_bg_tilemap8x4->enable(m_screen_layout);
|
||||
m_bg_tilemap4x8->enable(!m_screen_layout);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Display refresh
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void blktiger_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
|
||||
{
|
||||
uint8_t *buffered_spriteram = m_spriteram->buffer();
|
||||
int offs;
|
||||
|
||||
/* Draw the sprites. */
|
||||
for (offs = m_spriteram->bytes() - 4;offs >= 0;offs -= 4)
|
||||
{
|
||||
int attr = buffered_spriteram[offs+1];
|
||||
int sx = buffered_spriteram[offs + 3] - ((attr & 0x10) << 4);
|
||||
int sy = buffered_spriteram[offs + 2];
|
||||
int code = buffered_spriteram[offs] | ((attr & 0xe0) << 3);
|
||||
int color = attr & 0x07;
|
||||
int flipx = attr & 0x08;
|
||||
|
||||
if (flip_screen())
|
||||
{
|
||||
sx = 240 - sx;
|
||||
sy = 240 - sy;
|
||||
flipx = !flipx;
|
||||
}
|
||||
|
||||
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
|
||||
code,
|
||||
color,
|
||||
flipx,flip_screen(),
|
||||
sx+128,sy+6,15);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t blktiger_state::screen_update_blktiger(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(1023, cliprect);
|
||||
|
||||
if (m_bgon)
|
||||
(m_screen_layout ? m_bg_tilemap8x4 : m_bg_tilemap4x8)->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0);
|
||||
|
||||
if (m_objon)
|
||||
draw_sprites(bitmap, cliprect);
|
||||
|
||||
if (m_bgon)
|
||||
(m_screen_layout ? m_bg_tilemap8x4 : m_bg_tilemap4x8)->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0);
|
||||
|
||||
if (m_chon)
|
||||
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user