srcclean in preparation for branching release
This commit is contained in:
parent
2441cc0f8d
commit
a425bd5d90
@ -157,11 +157,11 @@ u8 swim1_device::ism_read(offs_t offset)
|
||||
{
|
||||
ism_sync();
|
||||
|
||||
// static const char *const names[] = {
|
||||
// "data", "mark", "crc", "param", "phases", "setup", "status", "handshake"
|
||||
// };
|
||||
// static const char *const names[] = {
|
||||
// "data", "mark", "crc", "param", "phases", "setup", "status", "handshake"
|
||||
// };
|
||||
|
||||
// logerror("read ism %s\n", names[offset & 7]);
|
||||
// logerror("read ism %s\n", names[offset & 7]);
|
||||
switch(offset & 7) {
|
||||
case 0x0: { // data
|
||||
u16 r = ism_fifo_pop();
|
||||
|
@ -1979,7 +1979,7 @@ std::vector<uint32_t> a2_nib_format::generate_levels_from_nibbles(const std::vec
|
||||
const auto trailing_padding_size = count_trailing_padding(nibbles);
|
||||
const auto trailing_FF_count =
|
||||
count_leading_FFs(nibbles.rbegin() + trailing_padding_size,
|
||||
nibbles.rend());
|
||||
nibbles.rend());
|
||||
const auto wrapped_FF_count = leading_FF_count + trailing_FF_count;
|
||||
const bool wrapped_FF_are_syncs = wrapped_FF_count >= min_sync_bytes;
|
||||
|
||||
@ -2042,11 +2042,11 @@ bool a2_nib_format::load(io_generic *io, uint32_t form_factor, const std::vector
|
||||
std::vector<uint8_t> nibbles(nibbles_per_track);
|
||||
for (unsigned track = 0; track < nr_tracks; ++track) {
|
||||
io_generic_read(io, &nibbles[0],
|
||||
track * nibbles_per_track, nibbles_per_track);
|
||||
track * nibbles_per_track, nibbles_per_track);
|
||||
auto levels = generate_levels_from_nibbles(nibbles);
|
||||
generate_track_from_levels(track, 0,
|
||||
levels,
|
||||
0, image);
|
||||
levels,
|
||||
0, image);
|
||||
}
|
||||
|
||||
image->set_form_variant(floppy_image::FF_525, floppy_image::SSSD);
|
||||
|
@ -1010,39 +1010,39 @@ void firebeat_spu_state::rf5c400_map(address_map& map)
|
||||
|
||||
IRQ2: Executes one command stored in a different buffer from IRQ1.
|
||||
The buffer can contain up to 8 commands.
|
||||
The command index counter increments after each IRQ2 call.
|
||||
If there is no command in the slot at the current counter then it just increments without executing a command.
|
||||
The command index counter increments after each IRQ2 call.
|
||||
If there is no command in the slot at the current counter then it just increments without executing a command.
|
||||
|
||||
Timing matters. In particular if the speed of the IRQ 2 calls is too fast then the volume and frequency animations will be wrong.
|
||||
The most common issue with bad timing is keysounds will be cut off.
|
||||
pop'n music Animelo 2 also has an issue when playing CHA-LA HEAD CHA-LA where one of the beginning keysounds will stay on a
|
||||
very high pitched frequency. The lower(?) the IRQ 2 frequency, the longer the keysound stays played it seems.
|
||||
Timing matters. In particular if the speed of the IRQ 2 calls is too fast then the volume and frequency animations will be wrong.
|
||||
The most common issue with bad timing is keysounds will be cut off.
|
||||
pop'n music Animelo 2 also has an issue when playing CHA-LA HEAD CHA-LA where one of the beginning keysounds will stay on a
|
||||
very high pitched frequency. The lower(?) the IRQ 2 frequency, the longer the keysound stays played it seems.
|
||||
|
||||
For beatmania III:
|
||||
cmd[0] = nop
|
||||
cmd[1] = 0x91bc -> Send stop command for all rf5c400 channels that are done playing
|
||||
cmd[2] = 0x310a -> Error checking? Sending some kind of state to main CPU???
|
||||
cmd[3] = 0x29c6 -> Increment a timer for each running DMA(ATA command?)
|
||||
Each timer must count up to 0x02e8 (744) before it will move on to the next DMA, which I believe is the time out counter.
|
||||
For beatmania III:
|
||||
cmd[0] = nop
|
||||
cmd[1] = 0x91bc -> Send stop command for all rf5c400 channels that are done playing
|
||||
cmd[2] = 0x310a -> Error checking? Sending some kind of state to main CPU???
|
||||
cmd[3] = 0x29c6 -> Increment a timer for each running DMA(ATA command?)
|
||||
Each timer must count up to 0x02e8 (744) before it will move on to the next DMA, which I believe is the time out counter.
|
||||
|
||||
In another part of the program (0x363c for a21jca03.bin) is the following code for determining when to start and stop the DMA:
|
||||
In another part of the program (0x363c for a21jca03.bin) is the following code for determining when to start and stop the DMA:
|
||||
|
||||
start_dma();
|
||||
while (get_dma_timer() < dma_max_timer) {
|
||||
if (irq6_called_flag) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
end_dma();
|
||||
start_dma();
|
||||
while (get_dma_timer() < dma_max_timer) {
|
||||
if (irq6_called_flag) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
end_dma();
|
||||
|
||||
irq6_called_flag is set only when IRQ6 is called.
|
||||
get_dma_timer is the timer that is incremented by 0x29c6.
|
||||
cmd[4] = 0x94de -> Animates rf5c400 channel volumes
|
||||
cmd[5] = 0x7b2c -> Send some kind of buffer status flags to spu_status_led_w. Related to IRQ4 since commands come from PPC to set buffer data
|
||||
cmd[6] = 0x977e -> Animates rf5c400 channel frequencies
|
||||
cmd[7] = 0x9204 -> Sends current state of rf5c400 channels as well as a list (bitmask integer) of usable channels up to main CPU memory.
|
||||
Also sends a flag to to spu_status_led_w that shows if there are available SE slots.
|
||||
If there are no available SE slots then it will set bit 3 to .
|
||||
irq6_called_flag is set only when IRQ6 is called.
|
||||
get_dma_timer is the timer that is incremented by 0x29c6.
|
||||
cmd[4] = 0x94de -> Animates rf5c400 channel volumes
|
||||
cmd[5] = 0x7b2c -> Send some kind of buffer status flags to spu_status_led_w. Related to IRQ4 since commands come from PPC to set buffer data
|
||||
cmd[6] = 0x977e -> Animates rf5c400 channel frequencies
|
||||
cmd[7] = 0x9204 -> Sends current state of rf5c400 channels as well as a list (bitmask integer) of usable channels up to main CPU memory.
|
||||
Also sends a flag to to spu_status_led_w that shows if there are available SE slots.
|
||||
If there are no available SE slots then it will set bit 3 to .
|
||||
|
||||
IRQ4: Dual-port RAM mailbox (when PPC writes to 0x3FE)
|
||||
Handles commands from PPC (bytes 0x00 and 0x01)
|
||||
|
@ -4,12 +4,12 @@
|
||||
|
||||
Insight Enterprises Z80 Single Board Computer
|
||||
|
||||
Possibly a prototype or part of a larger system. A video with more
|
||||
info is available at https://www.youtube.com/watch?v=_z1kBb-Zwpg.
|
||||
Possibly a prototype or part of a larger system. A video with more
|
||||
info is available at https://www.youtube.com/watch?v=_z1kBb-Zwpg.
|
||||
|
||||
TODO:
|
||||
- Verify device hookup
|
||||
- Figure out what's at 0x20, 0x21, 0x3c, 0x3d
|
||||
- Figure out what's at 0x20, 0x21, 0x3c, 0x3d
|
||||
- Hook up FDC
|
||||
- Hook up CRT8002 (video attributes)
|
||||
- Much more
|
||||
@ -81,15 +81,15 @@ void iez80_state::mem_map(address_map &map)
|
||||
void iez80_state::io_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
// map(0x20, 0x20).lr8([this]() { return machine().rand(); }, "unk20");
|
||||
// map(0x21, 0x21).lr8([this]() { return machine().rand(); }, "unk21");
|
||||
// map(0x20, 0x20).lr8([this]() { return machine().rand(); }, "unk20");
|
||||
// map(0x21, 0x21).lr8([this]() { return machine().rand(); }, "unk21");
|
||||
map(0x24, 0x27).rw("pio", FUNC(z80pio_device::read), FUNC(z80pio_device::write));
|
||||
map(0x28, 0x2b).rw("ctc", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
|
||||
map(0x2c, 0x2f).rw("dart1", FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
|
||||
map(0x32, 0x32).rw("dma", FUNC(z80dma_device::read), FUNC(z80dma_device::write));
|
||||
map(0x38, 0x3b).rw("dart2", FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
|
||||
// map(0x3c, 0x3c).lr8([this]() { return machine().rand(); }, "unk3c");
|
||||
// map(0x3d, 0x3d).lr8([this]() { return machine().rand(); }, "unk3d");
|
||||
// map(0x3c, 0x3c).lr8([this]() { return machine().rand(); }, "unk3c");
|
||||
// map(0x3d, 0x3d).lr8([this]() { return machine().rand(); }, "unk3d");
|
||||
map(0x40, 0x4f).rw("crtc", FUNC(crt5037_device::read), FUNC(crt5037_device::write));
|
||||
}
|
||||
|
||||
|
@ -1045,9 +1045,9 @@ void shoottv_state::shoottv_map(address_map &map)
|
||||
|
||||
void itech32_state::pubball_map(address_map &map)
|
||||
{
|
||||
itech020_map(map);
|
||||
map(0x300000, 0x300003).w(FUNC(itech32_state::color_w<0>)).umask32(0x00ff00ff);
|
||||
map(0x380000, 0x380003).w(FUNC(itech32_state::color_w<1>)).umask32(0x00ff00ff);
|
||||
itech020_map(map);
|
||||
map(0x300000, 0x300003).w(FUNC(itech32_state::color_w<0>)).umask32(0x00ff00ff);
|
||||
map(0x380000, 0x380003).w(FUNC(itech32_state::color_w<1>)).umask32(0x00ff00ff);
|
||||
}
|
||||
|
||||
|
||||
@ -4645,13 +4645,13 @@ ROM_START( gtclasscs ) /* Version 1.00S for the 3 tier type PCB with short ROM
|
||||
ROM_END
|
||||
|
||||
/***************************************************************************
|
||||
The ROM images for both sets below were found by analyzing the contents
|
||||
of archived source-code CDs acquired at auction. This is why the ROM
|
||||
definitions in question are not sized to a power of two, as most ROM
|
||||
dumps typically are.
|
||||
However, the provided dump of Power Up Baseball has been proven to
|
||||
work as-is on a properly-configured itech32 board, and passes all
|
||||
relevant ROM tests, and so can be considered authoritative.
|
||||
The ROM images for both sets below were found by analyzing the contents
|
||||
of archived source-code CDs acquired at auction. This is why the ROM
|
||||
definitions in question are not sized to a power of two, as most ROM
|
||||
dumps typically are.
|
||||
However, the provided dump of Power Up Baseball has been proven to
|
||||
work as-is on a properly-configured itech32 board, and passes all
|
||||
relevant ROM tests, and so can be considered authoritative.
|
||||
****************************************************************************/
|
||||
|
||||
ROM_START( shoottv )
|
||||
|
@ -2,28 +2,28 @@
|
||||
// copyright-holders:Angelo Salese
|
||||
/******************************************************************************
|
||||
|
||||
Jungle (c) 2001 Yonshi
|
||||
Jungle (c) 2001 Yonshi
|
||||
|
||||
TODO:
|
||||
- with a clean NVRAM MAME needs to be soft reset after init or the game
|
||||
will trip a '1111 exception' (caused by invalid opcode executed at
|
||||
0x102, incomplete decryption most likely);
|
||||
- Likewise anything in the 0x100-0x1f7 range doesn't seem valid at all;
|
||||
- game sometimes expects 1+ coins even if player has available points
|
||||
(and freezing with "COIN" text blinking), very unlikely to be intended
|
||||
behaviour?
|
||||
- system setting screen shows the following settings that don't seem to be
|
||||
affected by dips:
|
||||
* Min. Bet (always 1),
|
||||
* Credit X Ticket Mode (always Cencel (sic)),
|
||||
* Max. 10 Mode (always Max. 10);
|
||||
- sound doesn't seem to work 100% correctly (i.e. coin sound only seems
|
||||
to work from 3rd coin on, lots of invalid sample msgs in error.log).
|
||||
fwiw there's no extra OKI bank in the ROM, must be either invalid
|
||||
decryption or fancy OKI status readback instead.
|
||||
TODO:
|
||||
- with a clean NVRAM MAME needs to be soft reset after init or the game
|
||||
will trip a '1111 exception' (caused by invalid opcode executed at
|
||||
0x102, incomplete decryption most likely);
|
||||
- Likewise anything in the 0x100-0x1f7 range doesn't seem valid at all;
|
||||
- game sometimes expects 1+ coins even if player has available points
|
||||
(and freezing with "COIN" text blinking), very unlikely to be intended
|
||||
behaviour?
|
||||
- system setting screen shows the following settings that don't seem to be
|
||||
affected by dips:
|
||||
* Min. Bet (always 1),
|
||||
* Credit X Ticket Mode (always Cencel (sic)),
|
||||
* Max. 10 Mode (always Max. 10);
|
||||
- sound doesn't seem to work 100% correctly (i.e. coin sound only seems
|
||||
to work from 3rd coin on, lots of invalid sample msgs in error.log).
|
||||
fwiw there's no extra OKI bank in the ROM, must be either invalid
|
||||
decryption or fancy OKI status readback instead.
|
||||
Latter may be confirmed by video display stalling at the end of a
|
||||
normal round, OSD coin counter gets updated after the BGM completes
|
||||
playback.
|
||||
normal round, OSD coin counter gets updated after the BGM completes
|
||||
playback.
|
||||
- outputs (lamps & ticket dispenser at very least);
|
||||
|
||||
===============================================================================
|
||||
|
@ -775,7 +775,7 @@ ROM_START( loopingv )
|
||||
ROM_LOAD( "i-o.11a", 0x2800, 0x1000, CRC(61c74c79) SHA1(9f34d18a919446dd76857b851cea23fc1526f3c2) ) // speech
|
||||
|
||||
ROM_REGION( 0x0400, "mcu", 0 ) // COP420 microcontroller code
|
||||
ROM_LOAD( "cop.bin", 0x0000, 0x0400, CRC(d47fecec) SHA1(7eeedcb40f4cd50e1e259c6b01744a3fc97b60aa) )
|
||||
ROM_LOAD( "cop.bin", 0x0000, 0x0400, CRC(d47fecec) SHA1(7eeedcb40f4cd50e1e259c6b01744a3fc97b60aa) )
|
||||
|
||||
ROM_REGION( 0x1000, "gfx1", 0 )
|
||||
ROM_LOAD( "log2.8a", 0x0000, 0x800, CRC(ef3284ac) SHA1(8719c9df8c972a56c306b3c707aaa53092ffa2d6) )
|
||||
@ -799,7 +799,7 @@ ROM_START( loopingva )
|
||||
ROM_LOAD( "i-o.11a", 0x2800, 0x1000, CRC(61c74c79) SHA1(9f34d18a919446dd76857b851cea23fc1526f3c2) )
|
||||
|
||||
ROM_REGION( 0x0400, "mcu", 0 ) // COP420 microcontroller code
|
||||
ROM_LOAD( "cop.bin", 0x0000, 0x0400, CRC(d47fecec) SHA1(7eeedcb40f4cd50e1e259c6b01744a3fc97b60aa) )
|
||||
ROM_LOAD( "cop.bin", 0x0000, 0x0400, CRC(d47fecec) SHA1(7eeedcb40f4cd50e1e259c6b01744a3fc97b60aa) )
|
||||
|
||||
ROM_REGION( 0x1000, "gfx1", 0 )
|
||||
ROM_LOAD( "log2.8a", 0x0000, 0x800, CRC(ef3284ac) SHA1(8719c9df8c972a56c306b3c707aaa53092ffa2d6) )
|
||||
@ -825,7 +825,7 @@ ROM_START( looping )
|
||||
ROM_LOAD( "loopa11.bin", 0x2800, 0x1000, CRC(61c74c79) SHA1(9f34d18a919446dd76857b851cea23fc1526f3c2) ) // speech
|
||||
|
||||
ROM_REGION( 0x0400, "mcu", 0 ) // COP420 microcontroller code
|
||||
ROM_LOAD( "cop.bin", 0x0000, 0x0400, CRC(d47fecec) SHA1(7eeedcb40f4cd50e1e259c6b01744a3fc97b60aa) ) // taken from the other sets
|
||||
ROM_LOAD( "cop.bin", 0x0000, 0x0400, CRC(d47fecec) SHA1(7eeedcb40f4cd50e1e259c6b01744a3fc97b60aa) ) // taken from the other sets
|
||||
|
||||
ROM_REGION( 0x1000, "gfx1", 0 )
|
||||
ROM_LOAD( "loopaa8.bin", 0x0000, 0x800, CRC(ef3284ac) SHA1(8719c9df8c972a56c306b3c707aaa53092ffa2d6) )
|
||||
@ -848,7 +848,7 @@ ROM_START( skybump )
|
||||
ROM_LOAD( "snd.11a", 0x2800, 0x1000, CRC(61c74c79) SHA1(9f34d18a919446dd76857b851cea23fc1526f3c2) )
|
||||
|
||||
ROM_REGION( 0x0400, "mcu", 0 ) // COP420 microcontroller code
|
||||
ROM_LOAD( "cop.bin", 0x0000, 0x0400, CRC(d47fecec) SHA1(7eeedcb40f4cd50e1e259c6b01744a3fc97b60aa) )
|
||||
ROM_LOAD( "cop.bin", 0x0000, 0x0400, CRC(d47fecec) SHA1(7eeedcb40f4cd50e1e259c6b01744a3fc97b60aa) )
|
||||
|
||||
ROM_REGION( 0x1000, "gfx1", 0 )
|
||||
ROM_LOAD( "vid.8a", 0x0000, 0x800, CRC(459ccc55) SHA1(747f6789605b48be9e22f779f9e3f6c98ad4e594) )
|
||||
|
@ -5,37 +5,37 @@
|
||||
LSI M-THREE
|
||||
|
||||
Models:
|
||||
- M-THREE/100 (SA400, 5.25" single sided)
|
||||
- M-THREE/110 (SA410, 5.25" single sided)
|
||||
- M-THREE/150 (SA450, 5.25" double sided)
|
||||
- M-THREE/160 (SA460, 5.25" double sided)
|
||||
- M-THREE/200 (SA800, 8" single sided)
|
||||
- M-THREE/250 (SA850, 8" double sided) [emulated by default]
|
||||
- M-THREE/320 (SA800, 8" single sided, Winchester 5 MB)
|
||||
- M-THREE/325 (SA850, 8" double sided, Winchester 5 MB)
|
||||
- M-THREE/340 (SA800, 8" single sided, Winchester 10 MB)
|
||||
- M-THREE/345 (SA850, 8" double sided, Winchester 10 MB)
|
||||
- M-THREE/100 (SA400, 5.25" single sided)
|
||||
- M-THREE/110 (SA410, 5.25" single sided)
|
||||
- M-THREE/150 (SA450, 5.25" double sided)
|
||||
- M-THREE/160 (SA460, 5.25" double sided)
|
||||
- M-THREE/200 (SA800, 8" single sided)
|
||||
- M-THREE/250 (SA850, 8" double sided) [emulated by default]
|
||||
- M-THREE/320 (SA800, 8" single sided, Winchester 5 MB)
|
||||
- M-THREE/325 (SA850, 8" double sided, Winchester 5 MB)
|
||||
- M-THREE/340 (SA800, 8" single sided, Winchester 10 MB)
|
||||
- M-THREE/345 (SA850, 8" double sided, Winchester 10 MB)
|
||||
|
||||
Hardware:
|
||||
- Z80
|
||||
- 64 KB RAM
|
||||
- Z80 CTC
|
||||
- 2x D8255AC PPI
|
||||
- D8251A
|
||||
- MC6845P CRTC
|
||||
- FD1793 FDC
|
||||
- 64 KB RAM
|
||||
- Z80 CTC
|
||||
- 2x D8255AC PPI
|
||||
- D8251A
|
||||
- MC6845P CRTC
|
||||
- FD1793 FDC
|
||||
|
||||
TODO:
|
||||
- Initial PC is currently hacked to f000
|
||||
- Verify/fix floppy hookup (CPU needs to be overclocked?)
|
||||
- Printer interface
|
||||
- Buzzer
|
||||
- Map the rest of the keys, verify existing keys
|
||||
- Verify/fix floppy hookup (CPU needs to be overclocked?)
|
||||
- Printer interface
|
||||
- Buzzer
|
||||
- Map the rest of the keys, verify existing keys
|
||||
|
||||
Notes:
|
||||
- No offical software available, but a custom version of CP/M
|
||||
- Y to boot from floppy, ESC to enter monitor, any other key to
|
||||
boot from IDE
|
||||
- Y to boot from floppy, ESC to enter monitor, any other key to
|
||||
boot from IDE
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
There are 4 sound options,
|
||||
1: AY3-8930 on the mainboard.
|
||||
2: "Digital Sound Board" sound ROM + NEC D7759 on the romcard.
|
||||
3: "FM & Digital Sound Board" sound ROM + NEC D7759 & YM2413 (3.579Mhz) on the romcard.
|
||||
3: "FM & Digital Sound Board" sound ROM + NEC D7759 & YM2413 (3.579Mhz) on the romcard.
|
||||
4: "E.S.P. Board" sound ROMS + OKI M6376, + NEC C1892
|
||||
** later ESP boards also have a sub-board marked "RAM Protection Board"
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
TODO: Implement flashing (our only datasheet has that section
|
||||
completely illegible)
|
||||
|
||||
This is a simulation of code running on an NEC D78042GF-090
|
||||
This is a simulation of code running on an NEC D78042GF-090
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
|
@ -1155,10 +1155,10 @@ WRITE_LINE_MEMBER(macadb_device::adb_linechange_w)
|
||||
if (m_adb_datasize > 0)
|
||||
{
|
||||
LOGMASKED(LOG_LINESTATE, "Device has %d bytes of data:\n", m_adb_datasize);
|
||||
for (int i = 0; i < m_adb_datasize; i++)
|
||||
{
|
||||
LOGMASKED(LOG_LINESTATE, " %02x\n", m_adb_buffer[i]);
|
||||
}
|
||||
for (int i = 0; i < m_adb_datasize; i++)
|
||||
{
|
||||
LOGMASKED(LOG_LINESTATE, " %02x\n", m_adb_buffer[i]);
|
||||
}
|
||||
m_adb_linestate = LST_TSTOPSTART; // T1t
|
||||
m_adb_timer->adjust(attotime::from_ticks(324/4, adb_timebase));
|
||||
m_adb_stream_ptr = 0;
|
||||
|
@ -214,7 +214,7 @@ WRITE_LINE_MEMBER(mspactwin_state::flipscreen_w)
|
||||
{
|
||||
m_flipscreen = state;
|
||||
m_bg_tilemap->set_flip(m_flipscreen * ( TILEMAP_FLIPX + TILEMAP_FLIPY ) );
|
||||
// logerror("Flip: %02x\n", state);
|
||||
// logerror("Flip: %02x\n", state);
|
||||
}
|
||||
|
||||
|
||||
|
@ -341,7 +341,7 @@ static const std::map<std::string, const gdb_register_map &> gdb_register_maps =
|
||||
{ "r4600", gdb_register_map_r4600 },
|
||||
{ "ppc601", gdb_register_map_ppc601 },
|
||||
{ "m68020pmmu", gdb_register_map_m68020pmmu },
|
||||
{ "m68000", gdb_register_map_m68000 },
|
||||
{ "m68000", gdb_register_map_m68000 },
|
||||
{ "z80", gdb_register_map_z80 },
|
||||
{ "m6502", gdb_register_map_m6502 },
|
||||
{ "n2a03", gdb_register_map_m6502 },
|
||||
|
Loading…
Reference in New Issue
Block a user